【发布时间】:2021-12-04 01:50:13
【问题描述】:
我有以下pandas.DataFrame:
| id | year | x | |
|---|---|---|---|
| 0 | 01001 | 2015 | 0 |
| 1 | 01001 | 2016 | 0.5 |
| 2 | 01001 | 2017 | 0 |
| 3 | 01001 | 2018 | 0 |
| 4 | 01002 | 2015 | 0 |
| 5 | 01002 | 2016 | 0 |
| 6 | 01002 | 2017 | 0.0667525 |
| 7 | 01002 | 2018 | 0.133505 |
我的目标是创建一个新列,并第一次用1 填充每个窗口x > 0 之后的一行,并用0 填充所有前面的行。那就是:
| id | year | x | y | |
|---|---|---|---|---|
| 0 | 01001 | 2015 | 0 | 0 |
| 1 | 01001 | 2016 | 0.5 | 0 |
| 2 | 01001 | 2017 | 0 | 1 |
| 3 | 01001 | 2018 | 0 | 1 |
| 4 | 01002 | 2015 | 0 | 0 |
| 5 | 01002 | 2016 | 0 | 0 |
| 6 | 01002 | 2017 | 0.0667525 | 0 |
| 7 | 01002 | 2018 | 0.133505 | 1 |
如何做到这一点?
这就是我想出的:第一次获取每个组的索引x > 0,然后用该索引中的1 填充每个窗口,直到分区结束。然后,获取这些索引并将它们的行替换为0。
这是我的数据的可复制示例:
t = pd.DataFrame({'id':{0:'01001',1:'01001',2:'01001',3:'01001',4:'01002',5:'01002',6:'01002',7:'01002'},
'x':{0:0.0,1:0.5,2:0,3:0,4:0.0,
5:0.0,6:0.06675245612859726,7:0.13350491651818122},
'year':{0:2015,1:2016,2:2017,3:2018,4:2015,5:2016,6:2017,7:2018}})
t
【问题讨论】:
-
感谢编辑,您尝试过
df['y'] = df.groupby('id', as_index=False).apply(lambda p: (p['x'].shift().gt(0)).astype(int)).droplevel(0, axis=0)吗? -
啊!很近!我希望最后一次编辑能更好地展示我的问题。
-
是的,使用 cumsum,
df['y'] = df.groupby('id', as_index=False).apply(lambda p: (p['x'].shift().gt(0)).cumsum()).droplevel(0, axis=0)
标签: python pandas group-by partition-by