此问题在此处已有答案:
Multiple aggregations of the same column using pandas GroupBy.agg()(4个答案)
三年前就关门了。
我在使用Pandas的groupby功能时遇到了问题。我读过the documentation,但我看不出如何将聚合函数应用于多个列 * 和 * 为这些列提供了自定义名称。
这非常接近,但是返回的数据结构具有嵌套的列标题:
data.groupby("Country").agg(
{"column1": {"foo": sum()}, "column2": {"mean": np.mean, "std": np.std}})
(ie.我想取column2的mean和std,但将这些列返回为“mean”和“std”)
我错过了什么?
6条答案
按热度按时间kdfy810k1#
对于Pandas〉= 0.25
命名返回的聚合列的功能是reintroduced in the master branch,针对panda 0.25。新语法是
.agg(new_col_name=('col_name', 'agg_func')
。上面链接的PR中的详细示例:也可以使用多个lambda表达式,使用这个语法和我之前建议的两步重命名语法(如下所示),如this PR。
然后是
.rename()
,或者一次完成:对于Pandas〈0.25
unutbu目前接受的答案描述了在〈= 0.20的panda版本中执行此操作的很好的方法。但是,从panda 0.20开始,使用此方法会引发一个警告,表明该语法在panda的未来版本中将不可用。
系列:
未来警告:不赞成在Series上使用dict进行聚合,在将来的版本中将删除此功能
数据框:
未来警告:不赞成使用带有重命名的dict,在将来的版本中将删除它
根据Pandas0.20的修改日志,在聚合时重命名列的推荐方法如下。
请参阅0.20变更记录以取得其他详细信息。
更新2017 - 01 - 03以回应@JunkMechanic的评论。
使用旧式字典语法,可以将多个
lambda
函数传递给.agg
,因为这些函数将使用传递的字典中的键进行重命名:也可以将多个函数作为列表传递给单个列:
然而,这对lambda函数不起作用,因为它们是匿名的,并且都返回
<lambda>
,这会导致名称冲突:为了避免
SpecificationError
,可以预先定义命名函数,而不是使用lambda
。合适的函数名称还可以避免以后在 Dataframe 上调用.rename
。这些函数可以使用与上面相同的列表语法传递:368yc8dk2#
This will drop the outermost level from the hierarchical column index:
If you'd like to keep the outermost level, you can use the ravel() function on the multi-level column to form new labels:
update: in newer pandas instead of
.ravel()
use.tolist()
or.to_numpy()
use df.columns = ["_".join(x) for x in df.columns.tolist()]
For example:
yields
Alternatively, to keep the first level of the index:
yields
kr98yfug3#
我同意OP的观点,在同一个地方命名和定义输出列似乎更自然、更一致(例如,使用tidyverse's
summarize
in R时),但目前panda中的一个解决方案是在聚合之前 * 通过assign
* 创建具有所需名称的新列:(使用
reset_index
会将'Country'
、'f'
、'mean'
和'std'
全部转换为具有单独整数索引的常规列。)ryoqjall4#
如果您希望具有与JMP类似的行为,创建列标题以保留多索引中的所有信息,您可以用途:
它将更改您的 Dataframe :
至
mm5n2pyu5#
@Joel Ostblom的灵感
对于那些已经有一个仅用于聚合的可用字典的人,可以使用/修改以下代码用于较新版本的聚合,分离聚合和重命名部分。如果有多个项,请注意嵌套字典。
我们得到
如果有更聪明的方法,请告诉我。谢谢。
vktxenjb6#
比如这种 Dataframe ,列名有两层:
我们可以使用以下代码:
df.columns = [col[0] if col[-1]=='' else col[-1] for col in df.columns.values]
结果是: