我有dataframe
,
ID,CLASS_ID,ACTIVE
1,123,0
2,123,0
3,456,1
4,123,0
5,456,1
11,123,1
18,123,0
7,456,0
19,123,0
8,456,1
我试图获取CLASS_ID
具有相同值的ACTIVE
的累积计数。在上述数据帧的情况下,CLASS_ID
持续将ACTIVE
作为0
,直到第4个记录后一个下一个值为1。因此直到第4个记录为止,count应该为3。此过程必须继续进行,并且每次ACTIVE
的{{1}}值更改时都必须重新设置计数。预期的输出如下。
CLASS_ID
我尝试使用ID,CLASS_ID,ACTIVE,ACTIVE_COUNT
1,123,0,3
2,123,0,3
3,456,1,2
4,123,0,3
5,456,1,2
11,123,1,1
18,123,0,2
7,456,0,1
19,123,0,2
8,456,1,1
,但对我来说不起作用。有人可以帮我一下吗?
答案 0 :(得分:1)
您可以使用groupby
进行此操作:
ind = df.groupby('CLASS_ID').ACTIVE.apply(
lambda x: x.ne(x.shift()).cumsum()
)
df['ACTIVE_COUNT'] = df.groupby(['CLASS_ID', ind]).ACTIVE.transform('count')
df
ID CLASS_ID ACTIVE ACTIVE_COUNT
0 1 123 0 3
1 2 123 0 3
2 3 456 1 2
3 4 123 0 3
4 5 456 1 2
5 11 123 1 1
6 18 123 0 2
7 7 456 0 1
8 19 123 0 2
9 8 456 1 1
详细信息
首先,创建一个指标列,以标记每组具有相同值的行:
ind = df.groupby('CLASS_ID').ACTIVE.apply(
lambda x: x.ne(x.shift()).cumsum()
)
ind
0 1
1 1
2 1
3 1
4 1
5 2
6 3
7 2
8 3
9 3
Name: ACTIVE, dtype: int64
然后我们将ind
与{CLASS_ID“一起用作df.groupby
的分组参数,然后使用transform
计算每个组的大小。
df.groupby(['CLASS_ID', ind]).ACTIVE.transform('count')
0 3
1 3
2 2
3 3
4 2
5 1
6 2
7 1
8 2
9 1
Name: ACTIVE, dtype: int64