python - pandas DataFrame 中最大值对应的列名

标签 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)

最佳答案

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

关于python - pandas DataFrame 中最大值对应的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662993/

相关文章:

Python Pandas : delete rows in the past if there is a row on the 1st of january 2023 (grouped by user)

python - 时区不正确

python - 如何从 python 中的 steamID 获取 steamid 64

Python GroupBy 时间间隔

python - 删除重复项,但保留具有最高值的行,包括并列

pandas - 将 pandas df 扩展为按组包含其他 df 列的所有可能组合的版本

python - BeautifulSoup4 藏在哪里?

Python tksheet,如何更改列名称

python - 如何向在 api.ai 中混淆 Bot 的用户询问特定的事情?

python - 在Python中填充列表的列表