pandas 如何根据ID计算同组内的计数

btqmn9zl  于 2023-05-05  发布在  其他
关注(0)|答案(3)|浏览(174)

我的DataFrame看起来像:

df = pd.DataFrame({"ID":['A','B','A','A','B','B','C','D','D','C'], 
                   'count':[1,1,2,2,2,2,1,1,1,2]})
print(df)
  ID  count
0  A      1
1  B      1
2  A      2
3  A      2
4  B      2
5  B      2
6  C      1
7  D      1
8  D      1
9  C      2

我将只有ID列,我想计算count列。逻辑是我想累积计数ID的出现次数。如果它像index 2 & 3一样立即重复,它们都应该得到相同的计数。我如何才能做到这一点?
我的尝试并没有给出准确的结果:

df['x'] = df['ID'].eq(df['ID'].shift(-1)).astype(int)
df.groupby('ID')['x'].transform('cumsum')+1
0    1
1    1
2    2
3    2
4    2
5    2
6    1
7    2
8    2
9    1
Name: x, dtype: int32

这个问题与groupby累计计数没有直接关系,但它是不同的。

jhiyze9q

jhiyze9q1#

我们可以做filter然后返回reindex

(df[df.ID.ne(df.ID.shift())].groupby('ID').cumcount().add(1)
                            .reindex(df.index,method='ffill'))
Out[10]: 
0    1
1    1
2    2
3    2
4    2
5    2
6    1
7    1
8    1
9    2
dtype: int64
lx0bsm1f

lx0bsm1f2#

您也可以将groupby()sort=False一起使用:

df['count2'] = df[(df.ID.ne(df.ID.shift()))].groupby('ID', sort=False).cumcount().add(1)
df['count2'] = df['count2'].ffill()

输出

ID  count  count2
0  A      1       1
1  B      1       1
2  A      2       2
3  A      2       2
4  B      2       2
5  B      2       2
6  C      1       1
7  D      1       1
8  D      1       1
9  C      2       2
gk7wooem

gk7wooem3#

这也应该起作用:

df['ID'].ne(df['ID'].shift()).groupby(df['ID']).cumsum()

输出:

0    1
1    1
2    2
3    2
4    2
5    2
6    1
7    1
8    1
9    2

相关问题