对于以下数据框数据:
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)
答案 0 :(得分:4)
如果您不介意返回最大值的第一次出现(或者如果最大值始终是唯一的),请使用idxmax
df[['a', 'b', 'c']].idxmax(1)
0 a
1 c
dtype: object
如果需要所有最大次数的出现,请使用coldspeed's answer
答案 1 :(得分:2)
我能想到的最快的解决方案是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