我正在尝试找到一种caseid在非常大的数据集中生成值的方法。我希望caseid变量做两件事:(1)增加1when y = 1。重要的是,caseid在观察到后 的行中 ' 的值应该增加y = 1,并且 (2)1当case值发生变化时增加,即从A到B。示例数据如下:case = pd.Series(['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'])y = pd.Series([0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0])year = [2016, 2017, 2018, 2019, 2016, 2017, 2018, 2019, 2016, 2017, 2018, 2019]caseid = pd.Series([1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6])dict = {'case': case, 'y': y, 'year': year, 'caseid' : caseid} df = pd.DataFrame(dict) case y year caseid0 A 0 2016 11 A 1 2017 12 A 0 2018 23 A 0 2019 24 B 0 2016 35 B 1 2017 36 B 0 2018 47 B 0 2019 48 C 0 2016 59 C 0 2017 510 C 1 2018 511 C 0 2019 6非常感谢您的慷慨帮助!
2 回答
呼唤远方
TA贡献1856条经验 获得超11个赞
使用boolean mask连同DataFrame.cumsum:
df['case_id'] = (~df['case'].eq(df['case'].shift(1).fillna(df.loc[0,'case'])) |
df['y'].shift(1).fillna(0)).cumsum()+1
print(df)
case y year caseid
0 A 0 2016 1
1 A 1 2017 1
2 A 0 2018 2
3 A 0 2019 2
4 B 0 2016 3
5 B 1 2017 3
6 B 0 2018 4
7 B 0 2019 4
8 C 0 2016 5
9 C 0 2017 5
10 C 1 2018 5
11 C 0 2019 6
慕婉清6462132
TA贡献1804条经验 获得超2个赞
这有效:
df['case_id'] = ((~(df.case == df.case.shift())) | (df.y.shift()==1)).cumsum()
致谢:@Quang Hoang(仅缺少一个括号。)
添加回答
举报
0/150
提交
取消