Pandas GroupBy.agg() 抛出 TypeError: aggregate() 缺少 1 个必需的位置参数:'arg'

Posted

技术标签:

【中文标题】Pandas GroupBy.agg() 抛出 TypeError: aggregate() 缺少 1 个必需的位置参数:\'arg\'【英文标题】:Pandas GroupBy.agg() throws TypeError: aggregate() missing 1 required positional argument: 'arg'Pandas GroupBy.agg() 抛出 TypeError: aggregate() 缺少 1 个必需的位置参数:'arg' 【发布时间】:2019-11-11 06:41:01 【问题描述】:

我正在尝试为同一字段创建多个聚合。我在 python3.7 中的 pandas 中工作。根据文档,语法似乎很简单:

https://pandas-docs.github.io/pandas-docs-travis/user_guide/groupby.html#named-aggregation

我不明白为什么会收到以下错误。有人可以指出问题并告诉我如何解决吗?

代码:

qt_dy.groupby('date').agg(std_qty=('qty','std'),mean_qty=('qty','mean'),)

错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-62-6bb3aabf313f> in <module>
      5 
      6 qt_dy.groupby('date')\
----> 7 .agg(std_qty=('qty','std'),mean_qty=('qty','mean'))

TypeError: aggregate() missing 1 required positional argument: 'arg'

【问题讨论】:

【参考方案1】:

您似乎正在尝试将agg 与Named aggregations 一起使用—这是仅从 v0.25 及更高版本开始支持的功能

对于旧版本,您将需要使用元组列表格式:

qt_dy.groupby('date')['qty'].agg([('std_qty','std'), ('mean_qty','mean')])

或者,聚合多个列,一个字典:

qt_dy.groupby('date').agg('qty': [('std_qty','std'), ('mean_qty','mean')])

更多信息,请看我的回答here。

【讨论】:

谢谢你成功了。我正在用 anaconda 运行 python3.7。如果我升级了 conda 和我的所有软件包,我的原始代码可以工作吗?一个月前我刚刚在这台机器上安装了python,认为它是一个相当新版本的python。 @user3476463 不,这是熊猫版本的问题。 0.25 目前正在开发中,几周后不会发布。【参考方案2】:

我只是想补充一下上面的答案。

如果您收到此错误是因为您的 pandas 版本早于 0.25 print(pd.__version__),并且如果您想跨多个列进行聚合,请避免在此处生成 pandas 的数据透视结构是代码。

让我们首先创建一个示例 Pandas 数据框

import pandas as pd

df = pd.DataFrame('key1' : ['a','a','a','b','a'],
                   'key2' : ['c','c','d','d','e'],
                   'value1' : [1,2,2,3,3],
                   'value2' : [9,8,7,6,5])

df.head(5)

我们创建的表格如下所示:

|----------------|-------------|------------|------------|
|      key1      |     key2    |    value1  |    value2  |
|----------------|-------------|------------|------------|
|       a        |       c     |      1     |       9    |
|       a        |       c     |      2     |       8    |
|       a        |       d     |      2     |       7    |
|       b        |       d     |      3     |       6    |
|       a        |       e     |      3     |       5    |
|----------------|-------------|------------|------------|

现在要对value1value2 进行聚合,您将运行以下代码:

df_agg = df.groupby(['key1','key2'],as_index=False).agg('value1':['mean','count'],'value2':'sum')

df_agg.columns = ['_'.join(col).strip() for col in df_agg.columns.values]                                       

df_agg.head(5)

生成的表格如下所示:

|----------------|-------------|--------------------|-------------------|---------------------|
|      key1      |     key2    |     value1_mean    |   value1_count    |      value2_sum     |
|----------------|-------------|--------------------|-------------------|---------------------|
|       a        |      c      |         1.5        |         2         |          17         |
|       a        |      d      |         2.0        |         1         |           7         |   
|       a        |      e      |         3.0        |         1         |           5         |        
|       b        |      d      |         3.0        |         1         |           6         |     
|----------------|-------------|--------------------|-------------------|---------------------|

如果您希望列名称为其他名称,则只需将其重命名如下:

df_agg.rename(columns="value1_mean" : "mean of value1", 
                   "value1_count" : "count of value1",
                   "value2_sum" : "sum of value2"      
                   , inplace=True)

希望这会有所帮助。

【讨论】:

key1 和 key2 后面也有下划线;有没有办法避免这种情况?熊猫版本 0.24.2 您只需要重命名列名。这是我现在知道的唯一方法。我已经更新了我的答案,包括如何做到这一点。

以上是关于Pandas GroupBy.agg() 抛出 TypeError: aggregate() 缺少 1 个必需的位置参数:'arg'的主要内容,如果未能解决你的问题,请参考以下文章

Pandas groupby agg - 如何获得计数?

Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?

Pandas Groupby Agg 函数不减少

Pandas`agc`列表,“AttributeError / ValueError:函数不减少”

groupby+agg

dataframe一列分多列,某列中分隔数据转成多行 split explode,groupby与agg的使用方法