为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

四季花海 2022-01-11 15:47:11
我正在尝试找到一种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


查看完整回答
反对 回复 2022-01-11
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

这有效:

df['case_id'] = ((~(df.case == df.case.shift())) | (df.y.shift()==1)).cumsum()

致谢:@Quang Hoang(仅缺少一个括号。)


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信