我试图根据两个条件在熊猫中创建一个条件运行总和。
import pandas as pd
ID = [1,1,1,2,2,3,4]
after = ['A','B','B','A','A','B','A']
before = ['A','B','B','A','A','B','A']
df = pd.DataFrame([ID, before,after]).T
df.columns = ['ID','before','after']
数据如下:
ID before after
0 1 A A
1 1 B B
2 1 B B
3 2 A A
4 2 A A
5 3 B B
6 4 A A
然后,我想查看一个ID之前具有B值的时间,我的尝试是:
df['time_on_b'] = (df.groupby('before')['ID'].cumcount()+1).where(df['before']=='B',0)
这给了我:
ID before after time_on_b
0 1 A A 0
1 1 B B 1
2 1 B B 2
3 2 A A 0
4 2 A A 0
5 3 B B 3
6 4 A A 0
理想的输出如下:
ID before after time_on_b
0 1 A A 0
1 1 B B 1
2 1 B B 2
3 2 A A 0
4 2 A A 0
5 3 B B 1
6 4 A A 0
如您所见,随着ID的更改,我希望time_on_b重置,因此它给我的值为1而不是3。
似乎您需要按进行分组ID
,然后使用cumsum
来计数出现的次数B
:
cond = df.before == 'B'
df['time_on_b'] = cond.groupby(df.ID).cumsum().where(cond, 0).astype(int)
df
# ID before after time_on_b
#0 1 A A 0
#1 1 B B 1
#2 1 B B 2
#3 2 A A 0
#4 2 A A 0
#5 3 B B 1
#6 4 A A 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句