我在使用 Pandas 的 groupby 功能时遇到了问题。我已阅读 文档,但看不出如何将聚合函数应用于多列 以及 如何为这些列设置自定义名称。
这非常接近,但返回的数据结构具有嵌套的列标题:
data.groupby("Country").agg(
{"column1": {"foo": sum()}, "column2": {"mean": np.mean, "std": np.std}})
(即我想采用 column2 的平均值和标准差,但将这些列返回为“平均值”和“标准差”)
我错过了什么?
原文由 David Chouinard 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于熊猫 >= 0.25
命名返回聚合列的功能已 在 master 分支中重新引入, 并针对 pandas 0.25。新语法是
.agg(new_col_name=('col_name', 'agg_func')
。上面链接的 PR 中的详细示例:也可以将多个 lambda 表达式与此语法和我之前(下面)根据 此 PR 建议的两步重命名语法一起使用。同样,从 PR 中的示例复制:
然后
.rename()
,或者一次性:对于熊猫 < 0.25
unutbu 描述的当前接受的答案是在 <= 0.20 的熊猫版本中执行此操作的好方法。但是,从 pandas 0.20 开始,使用此方法会引发警告,表明该语法在未来的 pandas 版本中将不可用。
系列:
数据框:
根据 pandas 0.20 changelog ,聚合时重命名列的推荐方法如下。
有关更多详细信息,请参阅 0.20 更新日志。
更新 2017-01-03 以回应@JunkMechanic 的评论。
使用旧式字典语法,可以将多个
lambda
函数传递给.agg
,因为这些将使用传递的字典中的键重命名:多个函数也可以作为列表传递给单个列:
但是,这不适用于 lambda 函数,因为它们是匿名的并且全部返回
<lambda>
,这会导致名称冲突:为了避免
SpecificationError
,命名函数可以先验定义而不是使用lambda
。合适的函数名称也避免了之后在数据帧上调用.rename
。这些函数可以使用与上面相同的列表语法传递: