Pandas:查找每行最大(和第二大)值的列名和值

3

我有一个类似于DF1的输入(生成代码如下),希望输出一个类似于DF2的结果。

想法是为每一行找到具有最高值的列名,相应的值,以及该行中具有第二高值的列名和相应的值。

使用pandas是否有简单的方法来实现这个功能呢?

import pandas as pd
DF1 = pd.DataFrame({'User' : pd.Series(["Line1","Line2","Line3", "Line4"], index=['1', '2','3','4']), 'Var1' : pd.Series([9,12,3,21], index=['1', '2','3','4']),'Var2' : pd.Series([8,16,3,2], index=['1', '2','3','4']),'Var3' : pd.Series([7,5,6,9], index=['1', '2','3','4']),'Var4' : pd.Series([10,13,20,20], index=['1', '2','3','4']),'Var5' : pd.Series([8,2,13,1], index=['1', '2','3','4']),'Var6' : pd.Series([4,4,7,11], index=['1', '2','3','4']),'Var7' : pd.Series([15,13,4,7], index=['1', '2','3','4'])})
DF1

DF2 = pd.DataFrame({'User' : pd.Series(["Line1","Line2","Line3", "Line4"], index=['1', '2','3','4']), 'Max1Name' : pd.Series(["Var7","Var2","Var4","Var1"], index=['1', '2','3','4']),'Max1Value' : pd.Series([15,16,20,21], index=['1', '2','3','4']),'Max2Name' : pd.Series(["Var4","Var4","Var5","Var4"], index=['1', '2','3','4']),'Max2Value' : pd.Series([10,13,13,20], index=['1', '2','3','4'])})
DF2
1个回答

6

我不确定这是否是最简单的方法,但你可以这样做:

def top(x):
    x.set_index('User', inplace=True)
    df = pd.DataFrame({'Max1Name':[],'Max2Name':[],'Max1Value':[],'Max2Value':[]})
    df.index.name='User'
    df.loc[x.index.values[0],['Max1Name', 'Max2Name']] = x.sum().nlargest(2).index.tolist()
    df.loc[x.index.values[0],['Max1Value', 'Max2Value']] = x.sum().nlargest(2).values
    return df

DF1.groupby('User').apply(top).reset_index(level=1, drop=True).reset_index()

如何产生所需的输出:

    User Max1Name  Max1Value Max2Name  Max2Value
0  Line1     Var7         15     Var4         10
1  Line2     Var2         16     Var4         13
2  Line3     Var4         20     Var5         13
3  Line4     Var1         21     Var4         20

然而,更简单的方法是这样做:
DF1.groupby('User').apply(lambda x: x.set_index('User').sum().nlargest(2))

这将为您提供用户前两名:

    User       
Line1  Var7    15
       Var4    10
Line2  Var2    16
       Var4    13
Line3  Var4    20
       Var5    13
Line4  Var1    21
       Var4    20
dtype: int64

很好。请注意,nlargest在较旧版本的pandas上无法使用。必须从0.13升级到0.15。 - Alexis Eggermont

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