在 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) &lt;ipython-input-224-5ba549b5948f&gt; in &lt;module&gt; 2 y = np.random.randint(0,5,size=(100, 2)) 3 df = pd.DataFrame(y, columns=list('AB')) ----&gt; 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() 之后无法进行命名聚合的主要内容,如果未能解决你的问题,请参考以下文章

Pandas groupby agg - 如何获得计数?

python 用groupby之后生成新的数据框

错误:未捕获类型错误:无法读取未定义的属性“groupBy”

如何在熊猫中执行选择性 groupby().count()?

4.数据分组

PySpark 2.1.1 groupby + approx_count_distinct 计数为 0