2016-07-14 3 views
3

Я имею дело с dataframe, который выглядит как:Добавить новый столбец с существующими именами столбцов

FID   geometry          Code w1 w2 
0 12776 POLYGON ((-1.350000000000025 53.61540813717482... 12776 0 1 
1 13892 POLYGON ((6.749999999999988 52.11964001623148,... 13892 1 0 
2 14942 POLYGON ((-3.058896639907732e-14 51.3958198431... 14942 1 1 
3 18964 POLYGON ((8.549999999999974 45.26941059233587,... 18964 0 1 
4 19863 POLYGON ((-0.4500000000000305 44.6337746953077... 19863 0 1 

Моя цель состоит в том, чтобы добавить столбец, обозначенный как «Макс», где я собираюсь написать, который w (w1, w2) имеет большую частоту.

До сих пор мне удалось добавить столбец, в котором отображается максимальная частота, вместо имени столбца, где он отображается.

Нужный результат будет что-то вроде этого:

FID  geometry  Code w1 w2 Max 
0 12776 ...   12776 0 1 w2 
1 13892 ...   13892 1 0 w1 
2 14942 ...   14942 1 1 0 
3 18964 ...   18964 0 1 w2 
4 19863 ...   19863 0 1 w2 

Кроме того, я хотел бы, чтобы заполнить нулями, когда частоты одинаковы, если его возможно, в то же время.

Любая помощь будет оценена! :-)

ответ

4

Используйте np.where, чтобы выбрать 0, когда они равны idxmax(1), когда они не являются.

df['max'] = np.where(df.w1 == df.w2, 0, df[['w1', 'w2']].idxmax(1)) 
df 

    FID  geometry  Code w1 w2 Max 
0 12776 ...   12776 0 1 w2 
1 13892 ...   13892 1 0 w1 
2 14942 ...   14942 1 1 0 
3 18964 ...   18964 0 1 w2 
4 19863 ...   19863 0 1 w2 
+0

Отлично! Он отлично работает! В случае, когда у меня есть более двух w, есть ли способ сделать это? Предположим, у меня есть шесть w ... На самом деле маловероятно, что все w равны, но на всякий случай ... –

4

Что-то, как это должно работать:

(df['w1'] == df['w2']).map({True: 0}).fillna(df[['w1', 'w2']].idxmax(axis=1)) 
Out[26]: 
0 w2 
1 w1 
2  0 
3 w2 
4 w2 
dtype: object 

Как это работает:

Основная часть с idxmax:

df[['w1', 'w2']].idxmax(axis=1) 
Out[27]: 
0 w2 
1 w1 
2 w1 
3 w2 
4 w2 
dtype: object 

Это первый выбирает соответствующие столбцы, и возвращает индекс максимального значения (ось = 1 для столбцов). Однако он возвращает первый индекс в случае связей.

(df['w1'] == df['w2']).map({True: 0}) заполняет серию 0, если w1==w2. Остальные значения - NaN. Таким образом, они заполняются значениями idxmax.

Примечание: np.where определенно более логичный (и, вероятно, более быстрый) выбор здесь. Мне просто нравится экспериментировать с другими альтернативами.

+0

Это действительно умный способ сделать это, но я никогда не подумал бы сделать это таким образом. Благодаря! –

Смежные вопросы