Самое быстрое решение, которое я могу придумать, это 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