Добавьте столбцы в кадр данных pandas, содержащий максимальное количество каждой строки и соответствующее имя столбца

Моя система

Виндовс 7, 64 бит

питон 3.5.1

Задача

У меня есть кадр данных pandas, и я хотел бы узнать максимальное значение для каждой строки и добавить эту информацию в качестве нового столбца. Я также хотел бы знать имя столбца, в котором находится максимальное значение. И я хотел бы добавить еще один столбец в существующий фрейм данных, содержащий имя столбца, в котором можно найти максимальное значение.

Аналогичный вопрос был задан и дан ответ для R в этот пост.

Воспроизводимый пример

In[1]:
# Make pandas dataframe
df = pd.DataFrame({'a':[1,0,0,1,3], 'b':[0,0,1,0,1], 'c':[0,0,0,0,0]})

# Calculate max 
my_series = df.max(numeric_only=True, axis = 1)
my_series.name = "maxval"

# Include maxval in df
df = df.join(my_series)
df        

Out[1]:
    a  b  c  maxval
0   1  0  0  1
1   0  0  0  0
2   0  1  0  1
3   1  0  0  1
4   3  1  0  3

Все идет нормально. Теперь для добавьте еще один столбец в существующий фрейм данных, содержащий имя части столбца:

In[2]:
?
?
?


# This is what I'd like to accomplish:
Out[2]:
        a  b  c  maxval maxcol
    0   1  0  0  1      a
    1   0  0  0  0      a,b,c       
    2   0  1  0  1      b
    3   1  0  0  1      a
    4   3  1  0  3      a

Обратите внимание, что я хотел бы вернуть все имена столбцов, если несколько столбцов содержат одно и то же максимальное значение. Также обратите внимание, что столбец maxval не включен в maxcol, так как это не имеет особого смысла. Заранее спасибо, если кому-то это покажется интересным.


person vestland    schedule 06.07.2016    source источник


Ответы (1)


Вы можете сравнить df с maxval, используя eq с axis=0, затем использовать apply с lambda для создания логической маски для маскирования столбцов и join их:

In [183]:
df['maxcol'] = df.ix[:,:'c'].eq(df['maxval'], axis=0).apply(lambda x: ','.join(df.columns[:3][x==x.max()]),axis=1)
df

Out[183]:
   a  b  c  maxval maxcol
0  1  0  0       1      a
1  0  0  0       0  a,b,c
2  0  1  0       1      b
3  1  0  0       1      a
4  3  1  0       3      a
person EdChum    schedule 06.07.2016