给定另一列的值,如何增加一列的计数?

我正在尝试找到一种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  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

非常感谢您的慷慨帮助!


四季花海
浏览 136回答 2
2回答

呼唤远方

使用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()+1print(df)   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

慕婉清6462132

这有效:df['case_id'] = ((~(df.case == df.case.shift())) | (df.y.shift()==1)).cumsum()致谢:@Quang Hoang(仅缺少一个括号。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python