我正在浏览以下链接:Return top N largest values per group using pandas
,找到了找到每组前N个值的多种方法。
但是,我更喜欢具有agg函数的字典方法,并且想知道是否有可能针对以下问题获得与字典方法等效的方法?
import numpy as np
import pandas as pd
df = pd.DataFrame({'A': [1, 1, 1, 2, 2],
'B': [1, 1, 2, 2, 1],
'C': [10, 20, 30, 40, 50],
'D': ['X', 'Y', 'X', 'Y', 'Y']})
print(df)
A B C D
0 1 1 10 X
1 1 1 20 Y
2 1 2 30 X
3 2 2 40 Y
4 2 1 50 Y
df1 = df.groupby(['A'])['C'].nlargest(2).droplevel(-1).reset_index()
print(df1)
A C
0 1 30
1 1 20
2 2 50
3 2 40
# also this
df1 = df.sort_values('C', ascending=False).groupby('A', sort=False).head(2)
print(df1)
# also this
df.set_index('C').groupby('A')['B'].nlargest(2).reset_index()
df.groupby('A',as_index=False).agg(
{'C': lambda ser: ser.nlargest(2) # something like this
})
在这里可以使用字典吗?
答案 0 :(得分:1)
如果您想获得像 A这样的字典:C中的2个顶级值, 您可以运行:
df.groupby(['A'])['C'].apply(lambda x:
x.nlargest(2).tolist()).to_dict()
对于您的DataFrame,结果为:
{1: [30, 20], 2: [50, 40]}