确定每个组中每个列中具有相同值的大小

时间:2018-12-24 08:25:40

标签: python pandas dataframe group-by pandas-groupby

我有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 ,但对我来说不起作用。有人可以帮我一下吗?

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