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@sammywemmycount
列是预期的输出。我将只有ID
列信息。我的坏消息。我误解了这个问题。愉快地发表你的期望output@sammywemmycount
列是预期的输出。我将只有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。如果您仍然不理解,请再次阅读问题,并确保您理解其中给出的输出。