对应于pandas DataFrame中最大值的列名

时间:2018-12-07 03:53:26

标签: python python-3.x pandas dataframe

对于以下数据框数据:

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 :(得分: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