【发布时间】:2019-10-11 16:28:22
【问题描述】:
我正在浏览这个链接: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
})
这里可以用字典吗?
【问题讨论】:
-
你想使用字典方法本身的原因是什么?
-
@Erfan,保持一致并使用 agg.{dict} 用于所有 groupby 案例。 Pandas 有很多方法可以做同样的操作,坚持一种范式并尽可能在任何地方都遵循它是一个好习惯。 (例如,用 groupby 替换所有使用的 pivot、pivot table、melt 等,并且只在任何地方使用 groupby。)
-
老实说这没有任何意义,您应该为正确的用例使用正确的方法。不要对每种情况使用一种方法,因为它是“一致的”。
-
@Erfan 我部分同意你的看法。
groupby.agg(dict)看起来更易于阅读且跨平台(例如,在 PySpark 和 R 中类似)。我正在探索只使用一种方法来完成所有事情的方法。很难记住这么多方法。很高兴知道许多替代方案,但坚持一个。 -
@ALollz 我曾经使用
Series.groupby().agg(dict)进行重命名,例如{'minimal':'min', 'total':'sum'}。但是**kwargs是现在的方式。