Имя столбца, соответствующее наибольшему значению в панде DataFrame - PullRequest
0 голосов
/ 07 декабря 2018

для данных нижнего кадра:

x  y  a b c 
2  6 12 1 2
1  2  4 6 8

Я хочу получить результат в новом столбце (т. Е. D), который возвращает имя столбца с максимальным значением только среди a, b, c.

cols
a
c

Я пытаюсь найти максимальные значения из трех столбцов и вернуть имя столбца. Но вместо того, чтобы выбирать все строки набора данных, я хочу выбрать строки только из этих трех столбцов. Я использую следующий код:

def returncolname(row, colnames):
    return colnames[np.argmax(row.values)]
data['colmax'] = data.apply(lambda x: returncolname(x, data.columns), axis=1)

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Если вы не возражаете вернуть первое вхождение максимума (или если максимум всегда будет уникальным), используйте idxmax

df[['a', 'b', 'c']].idxmax(1)

0    a
1    c
dtype: object

Если вынужно максимальное количество событий, используйте ответ coldspeed

0 голосов
/ 07 декабря 2018

Самое быстрое решение, которое я могу придумать, это DataFrame.dot:

df.eq(df.max(1), axis=0).dot(df.columns)

Подробности
Сначала вычислим максимальное значение для строки:

df.max(1)
0    12
1     8
dtype: int64

Затем найдите позиции, из которых получены эти значения:

df.eq(df.max(1), axis=0)     
       x      y      a      b      c
0  False  False   True  False  False
1  False  False  False  False   True

Я использую eq, чтобы убедиться, что сравнение корректно передается по столбцам.

Затем вычислите скалярное произведение с помощьюсписок столбцов:

df.eq(df.max(1), axis=0).dot(df.columns)
0    a
1    c
dtype: object

Если максимальное значение не является уникальным, используйте

df.eq(df.max(1), axis=0).dot(df.columns + ',').str.rstrip(',')

, чтобы получить список столбцов через запятую.Например,

Измените пару значений:

df.at[0, 'c'] = 12
df.at[1, 'y'] = 8

Все то же самое, но обратите внимание, я добавляю запятую к каждому столбцу:

df.columns + ','
Index(['x,', 'y,', 'a,', 'b,', 'c,'], dtype='object')

df.eq(df.max(1), axis=0).dot(df.columns + ',')
0    a,c,
1    y,c,
dtype: object

Из этого,уберите любые запятые:

df.eq(df.max(1), axis=0).dot(df.columns + ',').str.rstrip(',') 
0    a,c
1    y,c
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...