在数据框中获取每行最大值所对应的所有列的列表

3
如何获取数据框中每一行最大值对应的所有列名列表? 例如,如果有以下数据框:
df = pd.DataFrame({'a':[12,34,98,26],'b':[12,87,98,12],'c':[11,23,43,1]})

    a   b   c
0  12  12  11
1  34  87  23
2  98  98  43
3  26  12   1

我想制作如下所示的另一个数据框:

0  [a,b] 
1  [b] 
2  [a,b]
3  [a]

我该怎样做?

3个回答

2
您可以尝试以下代码(两种方法都是相同的):
max_cols_df = pd.DataFrame({"max_cols": [list(df[df==mv].iloc[i].dropna().index) for i, mv in enumerate(df.max(axis=1))]})
max_cols_df = pd.DataFrame({"max_cols": [list(df.iloc[i][v].index) for i, v in df.eq(df.max(axis=1), axis=0).iterrows()]})

max_cols_df 
----------------
    max_cols
0   [a, b]
1   [b]
2   [a, b]
3   [a]
----------------

但是我认为您在另一篇文章中提出了相关问题,无法升级pandas。因此,第二个可能会抛出错误。


1
使用Pandas Melt解决
import pandas as pd

df = pd.DataFrame({'a':[12,34,98,26],'b':[12,87,98,12],'c':[11,23,43,1]})

df = df.reset_index()

df = pd.melt(df, id_vars=['index'],value_vars=['a','b','c'], var_name='col_name')

df['Index_Value_Max'] = df.groupby(['index'])['value'].transform('max')

df[df['value'] == df['Index_Value_Max']].groupby(['index']).agg({'col_name':'unique'}).reset_index()

输出:

在此输入图片描述


请问是否还有其他需要翻译的内容呢?

1

首先,获取每行的最大值:

df.max(axis=1)

然后检查数据框中的值是否等于最大值。

df.eq(df.max(axis=1), axis=0)

然后对每一行应用一个函数,以选择该行中值为True的列名。

df.apply(
    lambda row: [k for k, v in row.iteritems() if v], 
    axis=1
)

简而言之,这是:

df.eq(df.max(axis=1), axis=0).apply(
    lambda row: [k for k, v in row.iteritems() if v], 
    axis=1
)

0    [a, b]
1       [b]
2    [a, b]
3       [a]
dtype: object

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