将不同的聚合函数应用于不同的列(现在重命名字典已被弃用)

5
我之前曾经提出过这个问题:python pandas: applying different aggregate functions to different columns 但是最新的Pandas改变https://github.com/pandas-dev/pandas/pull/15931 表明我认为优雅且符合Python风格的解决方案已经被弃用了,原因我真心理解不了。

问题是:在进行groupby时,如何以一种可能符合Python风格且不太繁琐的方式,同时对不同字段应用不同的聚合函数(例如x的总和,x的平均值,y的最小值,z的最大值等),并重命名结果字段?即sum_x无法满足我的要求,我需要显式地重命名字段。

我喜欢的这种方法:

df.groupby('qtr').agg({"realgdp": {"mean_gdp": "mean", "std_gdp": "std"},
                                "unemp": {"mean_unemp": "mean"}})

即将被淘汰,现在会产生以下警告:

FutureWarning: using a dict with renaming is deprecated and will be removed in a future version

谢谢!


1
你可以在这里找到答案:https://dev59.com/fVcP5IYBdhLWcg3wRoEI - BENY
3
但是,正如@ErnestScribbler在那个答案中评论的那样,这并没有解决重命名的问题。我想这必须手动完成吗?对于有大量列的大型数据框,这意味着我不仅需要替换我的旧代码,而且新代码更长。为什么会这样? - Pythonista anonymous
1
我也很难理解为什么要这样做。这种方式感觉与Python的风格格格不入,而且非常快速地变得繁琐,特别是如果我不知道新列的实际名称。也许在github上再开一个线程会有所帮助吗?它只是感觉设计不良 :-( - Thomas
1
令人沮丧的是,即使不必要,我也感觉必须使用PySpark,只是因为我更喜欢它的语法:df.groupby("col1").agg(F.col(col2).mean().alias("myaggcolumn"), F.col(col3).max().alias("mymaxcolumn")。无论聚合函数输出什么,列名都会立即清晰明了。我可以注释掉/取消单行而无需更改其他任何内容。 - Thomas
1个回答

3

agg() 方法并没有被弃用,但是通过 agg() 重命名是已经被弃用了。

请详细查看文档:https://pandas.pydata.org/pandas-docs/stable/whatsnew.html#deprecate-groupby-agg-with-a-dictionary-when-renaming

被弃用的功能有: 1. 向分组、滚动或重新取样的 Series 中传递一个字典,以便重命名生成的聚合结果。 2. 向分组、滚动或重新取样的 DataFrame 中传递一个字典套字典。

虽然可能需要写多行代码,但以下方法可以实现相应的功能。

df.groupby('qtr').agg({"realgdp": ["mean",  "std"], "unemp": "mean"})

df.columns = df.columns.map('_'.join)

df.rename(columns = {'realgdp_mean': 'mean_gdp', 'realgdp_std':'std_gdp', 'unemp_mean':'mean_unemp'}, inplace = True)

1
我本来会想到使用 r.columns = [' '.join(col).strip() for col in r.columns.values] 这行代码,但你的代码更简洁!感谢澄清。我仍然很难理解为什么这个功能被弃用了。移除向后兼容应该是最后的选择。修改所有现有的代码是一件非常麻烦的事情。我看到了缺点,但我没有看到任何优点! - Pythonista anonymous
1
其实,如果我在同一列上使用多个lambda函数(例如计算总和的百分比和计数的百分比),重命名仍然是一个问题,因为那么我最终会得到具有相同名称的两列,即两个x_lambda。 - Pythonista anonymous
Zetrin在2017年10月12日的评论比我能做得更好:https://github.com/pandas-dev/pandas/pull/15931 - Pythonista anonymous
是的,但解决方案仍然相同,使用agg然后组合多索引列。 - Vaishali
我不明白这如何解决lambda函数的问题。如果我在列x上有两个lambda函数,那么最终会得到两个同名的列。 - Pythonista anonymous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接