我对Pandas的groupby功能有问题。我读过the documentation,但我看不到如何将聚合函数应用于多个列并且具有这些列的自定义名称。
这非常接近,但返回的数据结构具有嵌套的列标题:
data.groupby("Country").agg(
{"column1": {"foo": sum()}, "column2": {"mean": np.mean, "std": np.std}})
(即,我想取第2列的平均值和标准值,但将这些列返回为“平均值”和“标准值”)
我错过了什么?
Tags:
如果希望具有类似于JMP的行为,请创建列标题,以保留可以使用的多索引中的所有信息:
它将更改您的数据帧:
到
对于熊猫>;=0.25
命名返回聚合列的功能是reintroduced in the master branch,目标是pandas 0.25。新语法是
.agg(new_col_name=('col_name', 'agg_func')
。上面链接的PR的详细示例:也可以将多个lambda表达式与此语法和我前面(下面)根据this PR建议的两步重命名语法一起使用。同样,复制PR中的示例:
然后
.rename()
,或者一次性:对于熊猫<;0.25
联合国大学(unutbu)目前接受的答案是在pandas版本中实现这一点的好方法<;=0.20。但是,从pandas 0.20开始,使用此方法会引发一个警告,指出在pandas的未来版本中,语法将不可用。
系列:
数据帧:
根据pandas 0.20 changelog,建议在聚合时重命名列的方法如下。
请参阅0.20 changelog了解更多详细信息。
针对@JunkMechanic的评论更新2017-01-03。
使用旧式字典语法,可以将多个
lambda
函数传递给.agg
,因为这些函数将使用传递字典中的键重命名:也可以将多个函数作为列表传递给单个列:
但是,这不适用于lambda函数,因为它们是匿名的,并且都返回
<lambda>
,这会导致名称冲突:为了避免
SpecificationError
,可以预先定义命名函数,而不是使用lambda
。合适的函数名还可以避免随后在数据帧上调用.rename
。这些函数可以使用与上面相同的列表语法传递:这将从分层列索引中删除最外层:
如果希望保持最外层,可以在多级列上使用ravel()函数来形成新标签:
例如:
收益率
或者,要保持索引的第一级:
收益率
相关问题 更多 >
编程相关推荐