【问题标题】:Applying different aggregate functions to different columns (now that dict with renaming is deprecated)将不同的聚合函数应用于不同的列(现在不推荐使用重命名的 dict)
【发布时间】:2017-10-11 17:25:54
【问题描述】:

我之前问过这个问题:python pandas: applying different aggregate functions to different columns 但是熊猫的最新变化https://github.com/pandas-dev/pandas/pull/15931 意味着我认为是一个优雅和 Pythonic 的解决方案已被弃用,原因我真的无法理解。

问题是,现在仍然是:在进行 groupby 时,我如何将不同的聚合函数应用于不同的字段(例如 x 的总和、x 的平均值、y 的最小值、z 的最大值等)并重命名结果字段,一次完成,或者至少以一种可能是pythonic且不太麻烦的方式? IE。 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

谢谢!

【问题讨论】:

  • 你在这里得到了答案stackoverflow.com/questions/44635626/…
  • 但是,正如@ErnestScribbler 对该答案的评论,这并不能解决重命名问题。我想它必须手动完成?对于包含大量列的大型数据框,这意味着我不仅必须替换旧代码,而且新代码要长得多。这都是为什么???
  • 我也很难理解为什么要这样做。感觉如此令人难以置信的 unpythonic 并且很快变得非常麻烦,特别是如果我不知道新列将如何实际命名。也许在 github 上打开另一个关于此的线程会有所帮助?感觉就像糟糕的设计:-(
  • 令人沮丧的是,即使没有必要,我也不得不使用 PySpark,因为我更喜欢这种语法:df.groupby("col1").agg(F.col(col2).mean( ).alias("myaggcolumn"), F.col(col3).max().alias("mymaxcolumn")。无论聚合函数吐出什么,立即清楚列名是什么。我可以注释掉/在单行中,无需更改任何其他内容

标签: python pandas group-by


【解决方案1】:

agg() 没有被弃用,但使用 agg 重命名是。

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

不推荐使用的内容: 1.将字典传递给分组/滚动/重新采样的系列,允许重命名结果聚合 2. 将 dict-of-dicts 传递给分组/滚动/重采样的 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)

【讨论】:

  • 我会想到 r.columns = [' '.join(col).strip() for col in r.columns.values] 但你的行字符更少!感谢您的澄清。我仍然很难理解为什么在地球上这被弃用了。删除向后兼容性应该是最后的手段。更改所有现有代码是一个巨大的痛苦。我看到了缺点,我没有看到任何好处!
  • 实际上,如果我在同一列上使用多个 lambda 函数(例如计算总和的百分比和计数的百分比),重命名仍然是一个问题,因为那样我最终会得到两列同名,两个 x_lambda
  • Zetrin 在 2017 年 10 月 12 日的评论说得比我更有说服力:github.com/pandas-dev/pandas/pull/15931
  • 是的,但解决方案保持不变,使用 agg 然后合并多索引列
  • 我没有关注这如何解决 lambda 函数的问题。如果我在 x 列上有两个 lambda 函数,我最终会得到两个同名的列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2015-08-20
  • 1970-01-01
  • 2017-11-21
  • 2016-07-06
  • 1970-01-01
相关资源
最近更新 更多