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

4

以下是数据框的数据:

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个回答

7

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

你能详细解释一下吗? - Vro
@VroJ 已编辑,请查看我的脚注。 - cs95
@VroJ 是否可能存在多个最大值? - cs95
这正是我想知道的。大约有多个最大值约为14。 - Vro
我通过使用问题中的代码将数据放入另一个数据框中来完成此操作,但由于有 5,50,000 个观测值,合并数据变得困难。 - Vro

5

如果您不介意返回最大值的第一个出现位置(或者最大值总是唯一的),可以使用idxmax

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

0    a
1    c
dtype: object

如果你需要找到所有最大值的出现次数,可以使用 coldspeed 的答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接