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

Python 如何根据ID计算同一组内的计数,python,pandas,Python,Pandas,我的数据框看起来像: 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

我的数据框看起来像:

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
的出现次数。如果它像
索引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累积计数没有直接关系,但它是不同的。

我们可以做
过滤
然后
重新索引
返回

(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

我们可以做
过滤
然后
重新索引
返回

(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

您还可以将
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

您还可以将
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

请将您的期望寄出output@sammywemmy
count
列是预期的输出。我将只有
ID
列信息。我的坏消息。我误解了这个问题。愉快地发表你的期望output@sammywemmy
count
列是预期的输出。我将只有
ID
列信息。我的坏消息。我误解了这个问题。使用reindex和只考虑累计ID一次的愉快逻辑。这非常好,非常有教育意义。也许还可以为未来的访问者解释一下为什么(一点一点)这样做有效。我知道我在这方面学到了一两件事:)使用reindex和只考虑一次累积ID的好逻辑。这非常好,非常有教育意义。也许还可以为未来的访问者解释一下为什么(一点一点)这样做有效。我知道我在这方面学到了一两件事:)你能检查一下输出吗。这并没有产生正确的结果。因此,我的输出是不同的,但我不知道为什么要在索引7和8中有1个,在索引9中有2个,如果是2个连续的D和1个连续的C
为什么要在索引7和8中有1个
<索引9中的代码>2,这是因为
C
第二次出现,不考虑连续的C。如果您仍然不理解,请重新阅读问题,并确保您理解其中给出的输出。请检查输出。这并没有产生正确的结果。因此,我的输出是不同的,但我不知道为什么要在索引7和8中有1个,在索引9中有2个,如果是2个连续的D和1个连续的C
为什么要在索引7和8中有1个
<索引9中的代码>2,这是因为
C
第二次出现,不考虑连续的C。如果您仍然不理解,请再次阅读问题,并确保您理解其中给出的输出。