pandas python 中重命名多个聚合结果列的问题

Issue in renaming the multiple aggregation outcome columns in pandas python

我对 pandas 中的多重聚合有疑问。

本来我有一个显示油价的数据集,详情如下:

数据集头部如下:

我这里要做的是获取2014年每个季度的均值和标准差,理想的输出如下:

在我的脚本中,我已经通过这样做创建了季度信息。

但是,有一件事我在这里不明白:

如果我尝试使用此命令来执行此操作

brent[brent.index.year == 2014].groupby('quarter').agg({"average_price": np.mean, "std_price": np.std})

我得到如下错误:

如果我使用以下脚本,它就可以工作

brent[brent.index.year == 2014].groupby('quarter').agg(average_price=('Price','mean'), 
                                                   std_price=('Price','std'))

所以问题是:

提前感谢大家的帮助!

What's wrong with the first approach here?

有传递的字典,所以pandas从键average_pricestd_price寻找列,因为如果return错误,DataFrame中不存在。

可能的解决方案是在 groupby 之后指定列,并通过聚合函数为指定的新列名传递元组列表:

brent[brent.index.year == 2014].groupby('quarter')['Price'].agg([('average_price','mean'),('std_price',np.std)])

这是可能的,因为对于一列 Price 可以定义多个列名称。

在以后的pandas版本中使用named aggregations:

brent[brent.index.year == 2014].groupby('quarter').agg(average_price=('Price','mean'), 
                                                      std_price=('Price',np.std))

这是逻辑 - 每个聚合都定义了带有聚合列和聚合函数的 nw 列名。因此可以聚合具有不同功能的多个列:

brent[brent.index.year == 2014].groupby('quarter').agg(average_price=('Price','mean'), 
                                                      std_price=('Price',np.std),
                                                      sumQ=('quarter','sum'))

注意,np.std 有默认的 ddof=0 而 pandas stdddof=1,所以不同的输出。