【问题标题】:Adding a 'count' column to the result of a groupby in pandas?在熊猫的分组结果中添加“计数”列?
【发布时间】:2026-02-11 23:40:01
【问题描述】:

我认为这是一个相当基本的问题,但我似乎找不到解决方案。

我有一个类似于以下内容的 pandas 数据框:

import pandas as pd

df = pd.DataFrame({'A' : ['x','x','y','z','z'],
                   'B' : ['p','p','q','r','r']})
df

创建一个这样的表:

    A   B
0   x   p
1   x   p
2   y   q
3   z   r
4   z   r

我正在尝试创建一个表来表示该数据框中不同值的数量。所以我的目标是这样的:

    A   B   c
0   x   p   2
1   y   q   1
2   z   r   2

不过,我找不到正确的函数来实现这一点。我试过了:

df.groupby(['A','B']).agg('count')

这会生成一个包含 3 行(如预期)但没有“计数”列的表。我不知道如何在该计数列中添加。有人能指出我正确的方向吗?

【问题讨论】:

  • 重新打开了这个问题,因为这个问题更具体(“获取大小”)而不是“获取我要求的这些随机统计数据”)

标签: python pandas


【解决方案1】:

您可以使用size

df.groupby(['A','B']).size()
Out[590]: 
A  B
x  p    2
y  q    1
z  r    2
dtype: int64

为您的解决方案添加一列

df.groupby(['A','B']).B.agg('count')
Out[591]: 
A  B
x  p    2
y  q    1
z  r    2
Name: B, dtype: int64

更新:

df.groupby(['A','B']).B.agg('count').to_frame('c').reset_index()

#df.groupby(['A','B']).size().to_frame('c').reset_index()
Out[593]: 
   A  B  c
0  x  p  2
1  y  q  1
2  z  r  2

【讨论】:

  • 这是一个简单地添加新计数列的解决方法,但显然是“pythonic”的做事方式。
  • 如果你写df.groupby(['A','B'])[["B"]].agg('count'),你就不需要.to_frame——这将返回一个DataFrame而不是一个系列。
【解决方案2】:

熊猫 >= 1.1:DataFrame.value_counts

这是 df.groupby(['A', 'B']).size() 的相同替换。

df.value_counts(['A', 'B'])

A  B
z  r    2
x  p    2
y  q    1
dtype: int64
df.value_counts(['A', 'B']).reset_index(name='c')

   A  B  c
0  z  r  2
1  x  p  2
2  y  q  1

【讨论】: