我有以下幾點pandas.DataFrame:
| ID | 年 | 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 | 年 | X | 是 | |
|---|---|---|---|---|
| 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
uj5u.com熱心網友回復:
有條件地檢查連續發生怎么樣?
df['y'] = df.groupby('id', as_index=False).apply(lambda p: (p['x'].shift().gt(0)).cumsum()).droplevel(0, axis=0)
id year x y
0 1001 2015 0.000000 0
1 1001 2016 0.500000 0
2 1001 2017 0.000000 1
3 1001 2018 0.000000 1
4 1002 2015 0.000000 0
5 1002 2016 0.000000 0
6 1002 2017 0.066753 0
7 1002 2018 0.133505 1
uj5u.com熱心網友回復:
讓我們試試transform:
df['y'] = (df.index > (df['x']>0).groupby(df['id']).transform('idxmax')).astype(int)
df
id year x out
0 1001 2015 0.000000 0
1 1001 2016 0.500000 0
2 1001 2017 0.000000 1
3 1001 2018 0.000000 1
4 1002 2015 0.000000 0
5 1002 2016 0.000000 0
6 1002 2017 0.066753 0
7 1002 2018 0.133505 1
uj5u.com熱心網友回復:
這是一種使用方法 cumprod
df.groupby('id')['x'].transform(lambda x: (~x.eq(0).shift().cumprod().astype(bool)).astype(int))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318183.html
下一篇:同一行上有多個串列的索引超出范圍
