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