TLDR; Pandas groupby.agg 有一个新的、更简单的语法,用于指定 (1) 多列上的聚合,以及 (2) 列上的多个聚合。因此,要对 pandas >= 0.25 执行此操作,请使用
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
或
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
Pandas 改变了 GroupBy.agg 的行为,转而采用更直观的语法来指定命名聚合。请参阅 0.25 docs section on Enhancements 以及相关的 GitHub 问题 GH18366 和 GH26512。
从文档中,
通过控制输出来支持特定于列的聚合
列名,pandas 接受 GroupBy.agg() 中的特殊语法,
称为“命名聚合”,其中
- 关键字是输出列名
- 值是元组,其第一个元素是要选择的列,第二个元素是要应用于该列的聚合。
Pandas 为 pandas.NamedAgg 命名元组提供字段
['column', 'aggfunc'] 以更清楚地说明参数是什么。作为
通常,聚合可以是可调用的或字符串别名。
您现在可以通过关键字参数传递元组。元组遵循(<colName>, <aggFunc>)的格式。
import pandas as pd
pd.__version__
# '0.25.0.dev0+840.g989f912ee'
# Setup
df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
'height': [9.1, 6.0, 9.5, 34.0],
'weight': [7.9, 7.5, 9.9, 198.0]
})
df.groupby('kind').agg(
max_height=('height', 'max'), min_weight=('weight', 'min'),)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
或者,您可以使用pd.NamedAgg(本质上是一个命名元组),这会使事情更加明确。
df.groupby('kind').agg(
max_height=pd.NamedAgg(column='height', aggfunc='max'),
min_weight=pd.NamedAgg(column='weight', aggfunc='min')
)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
Series 更简单,只需将 aggfunc 传递给关键字参数即可。
df.groupby('kind')['height'].agg(max_height='max', min_height='min')
max_height min_height
kind
cat 9.5 9.1
dog 34.0 6.0
最后,如果您的列名不是有效的 Python 标识符,请使用解包字典:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
熊猫
在更新至 0.24 的 pandas 版本中,如果使用字典为聚合输出指定列名,您将获得 FutureWarning:
df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed
# in a future version
Using a dictionary for renaming columns is deprecated in v0.20. 在更新版本的 pandas 上,这可以通过传递元组列表更简单地指定。如果以这种方式指定函数,则该列的 所有 函数需要指定为 (name, function) 对的元组。
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
或者,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895