在pandas中对groupby的结果添加一个“count”列?

37

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

我有一个类似于以下的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行的表格(如预期),但没有“计数”列。我不知道如何添加该计数列。是否有人可以指点我一下?

这会产生一个有3行的表格(正如预期的那样),但是缺少了一个“计数”列。我不知道如何加入这个计数列。请问是否有人可以指导我?

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

53

您可以使用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

2
这是一个非常麻烦的解决方法,只是为了简单地添加一个新的计数列,但显然这是“Pythonic”做事的方式。 - Seymour
如果你写了 df.groupby(['A','B'])[["B"]].agg('count'),你就不需要使用 .to_frame - 这会返回一个 DataFrame 而不是一个 series。 - Markus
如何按B分组并保留A的值? - Peter.k

18

pandas >= 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接