Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定在另一列中具有相同值的每个组内的大小_Python_Pandas_Dataframe_Group By_Pandas Groupby - Fatal编程技术网

Python 确定在另一列中具有相同值的每个组内的大小

Python 确定在另一列中具有相同值的每个组内的大小,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,我有这样的dataframe ID,CLASS\u ID,活动 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 我正在尝试获取类ID的累积计数,该类ID的值与活动的值相同。在上述数据帧的情况下,CLASS_ID连续具有ACTIVEas0,直到下一个值为1的第四个记录桩。所以直到第四个记录,计数应该是3。必须继续此过程,并且每次CLASS_ID的ACTIVE值发生变化时,必须重置

我有这样的
dataframe

ID,CLASS\u ID,活动
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
我正在尝试获取
类ID的累积计数,该类ID的值与
活动的值相同。在上述数据帧的情况下,
CLASS_ID
连续具有
ACTIVE
as
0
,直到下一个值为1的第四个记录桩。所以直到第四个记录,计数应该是3。必须继续此过程,并且每次
CLASS_ID
ACTIVE
值发生变化时,必须重置计数。预期输出如下所示

ID,类ID,活动,活动计数
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

我试着使用
df.groupby(..).transform(..)
,但它不适合我。有人能帮我一点忙吗?

你可以用
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
作为
df.groupby
的grouper参数以及“CLASS_ID”,然后使用
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

你是说第三张而不是第四张唱片吗?还是没有真正理解你的问题。