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 |
|----------------|-------------|------------|------------|
现在要对value1
和value2
进行聚合,您将运行以下代码:
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() - 如何在没有多索引的情况下返回结果?