Cumsum в группе и сбрасывается при условии в пандах

У меня есть датафрейм с двумя столбцами ID и активность. Действие равно 0 или 1. Я хочу новый столбец, содержащий возрастающее число, поскольку последнее действие было 1. Однако, количество должно быть только в пределах одной группы (ID). Если активность равна 1, столбец подсчета должен быть сброшен до 0, и счет начинается снова.

Итак, у меня есть датафрейм, содержащий следующее:

Что нужно, так это:

Кто-нибудь может мне помочь?

1 ответ

Мы используем новый пункт "G" здесь

df['G']=df.groupby('ID').Activeity.apply(lambda x :(x.diff().ne(0)&x==1)|x==1)

df.groupby([df.ID,df.G.cumsum()]).G.apply(lambda x : (~x).cumsum())

Out[713]: 
0     1
1     2
2     0
3     1
4     2
5     1
6     2
7     0
8     1
9     0
10    1
11    1
12    0
13    0
14    1
15    2
Name: G, dtype: int32

Ввод данных

df=pd.DataFrame({'ID':list('AAAAABBBBBBCCCCC'),'Activeity':[0,0,1,0,0,0,0,1,0,1,0,0,1,1,0,0]})

Пояснение:

Here we get the new para 'G'
df['G']=df.groupby('ID').Activeity.apply(lambda x :(x.diff().ne(0)&x==1)|x==1)
df
Out[134]: 
    Activeity ID      G
0           0  A  False
1           0  A  False
2           1  A   True
3           0  A  False
4           0  A  False
5           0  B  False
6           0  B  False
7           1  B   True
8           0  B  False
9           1  B   True
10          0  B  False
11          0  C  False
12          1  C   True
13          1  C   True
14          0  C  False
15          0  C  False

Тогда мы делаем cumsum для G, чтобы получить где цикл, мы должны установить число в 0

df.G.cumsum()
Out[135]: 
0     0
1     0
2     1
3     1
4     1
5     1
6     1
7     2
8     2
9     3
10    3
11    3
12    4
13    5
14    5
15    5
Name: G, dtype: int32
Другие вопросы по тегам