我能想到的最快的解决方案是使用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