在 groupby().count() 之后无法进行命名聚合
Posted
技术标签:
【中文标题】在 groupby().count() 之后无法进行命名聚合【英文标题】:Unable to do named aggregation after groupby().count() 【发布时间】:2021-11-13 02:46:28 【问题描述】:我有一个包含两列的数据框。我需要按其中一列分组,然后找到具有最大行数的组和该组的名称。因此我有以下代码:
np.random.seed(42)
y = np.random.randint(0,5,size=(100, 2))
df = pd.DataFrame(y, columns=list('AB'))
df.groupby('A').count().agg(['max','idxmax'])
这个的输出:
B
max 28
idxmax 3
也就是说,第 3 组的行数最多。最大值为 28。
我想要以下带有命名聚合的输出:
Max ID
28 3
我的解决方案尝试:
np.random.seed(42)
y = np.random.randint(0,5,size=(100, 2))
df = pd.DataFrame(y, columns=list('AB'))
df.groupby('A').count().agg(Max=('B','max'), ID=('B','idxmax'))
这会引发以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-113-dcd54f9ab49e> in <module>
2 y = np.random.randint(0,5,size=(100, 2))
3 df = pd.DataFrame(y, columns=list('AB'))
----> 4 df.groupby('A').count().agg(Max=('B','max'),ID=('B','idxmax'))
TypeError: aggregate() missing 1 required positional argument: 'func'
如果我删除 count() 函数,那么命名聚合似乎可以工作。但是当然,它不是在计算我想要计算的内容。
我想让这个工作,因为我的解决方法看起来很混乱:
np.random.seed(42)
y = np.random.randint(0,5,size=(100, 2))
df = pd.DataFrame(y, columns=list('AB'))
df.groupby('A').count().agg(['max','idxmax']).T.reset_index(drop=True).rename(columns='max':'Max',
'idxmax':'ID')
输出:
Max ID
0 28 3
熊猫版本 1.0.5。
【问题讨论】:
需要 as_index=False 参数 -df.groupby('A', as_index=False).count().agg(Max=('B','max'),ID=('B','idxmax')).T
@Chris 这会引发与我相同的错误
【参考方案1】:
使用size() 而不是count() 可以进行小幅简化:
import pandas as pd
import numpy as np
np.random.seed(42)
y = np.random.randint(0,5,size=(100, 2))
df = pd.DataFrame(y, columns=list('AB'))
df = df.groupby('A').size().agg(Max='max', ID='idxmax')
print(df)
请注意 size() 和 count() 不相同。大小是每组中的行数。计数是每组中每列中非缺失值的数量。因此,size() 返回的是 Series 而不是 DataFrame。
当然,也就是说聚合之后,输出的也是一个Series而不是一个DataFrame:
Max 28
ID 3
dtype: int64
...您可能关心也可能不关心。
【讨论】:
对我来说,运行此程序后出现以下错误:--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-224-5ba549b5948f> in <module> 2 y = np.random.randint(0,5,size=(100, 2)) 3 df = pd.DataFrame(y, columns=list('AB')) ----> 4 df = df.groupby('A').size().agg(Max='max', ID='idxmax') TypeError: aggregate() missing 1 required positional argument: 'func'
奇怪 - 它适用于 Pandas v1.3.2。你可以升级。或者,如果这不是一个选项,您可以将 agg 更改为 df = df.groupby('A').size().agg('Max': 'max', 'ID': 'idxmax')
,我刚刚在 v1.0.5 中进行了测试。
将 Pandas 更新到 1.3.2 解决了问题以上是关于在 groupby().count() 之后无法进行命名聚合的主要内容,如果未能解决你的问题,请参考以下文章
错误:未捕获类型错误:无法读取未定义的属性“groupBy”