我有一个数据框架如下:
df =
integer_id begin
0 13
0 15
0 18
0 19
1 10
1 15
1 17
我想计算第三列end
,其中df.end
由给定integer_id
的下一个df.start
定义,因此,例如,
上面的将变成
df =
integer_id begin end
0 13 15
0 15 18
0 18 19
0 19
1 10 15
1 15 17
1 17
此外,对于每个integer_id
的最后一行,我希望end
转到25
,对于每个integer_id
的第一行,我希望start
被截断到10
,所以最终,我们将有
df =
integer_id begin end
0 10 15
0 15 18
0 18 19
0 19 20
1 10 15
1 15 17
1 17 20
我不太擅长熊猫,但我想我将不得不在这里使用apply
和groupby('integer_id')
,或者有另一种方法我可以在这里应用?
使用groupby.shift
+fillna
和布尔索引duplicated
:
df['end'] = (df.groupby('integer_id')['begin'].shift(-1)
.fillna(20, downcast='infer')
)
df.loc[~df['integer_id'].duplicated(), 'begin'] = 10
输出:
integer_id begin end
0 0 10 15
1 0 15 18
2 0 18 19
3 0 19 20
4 1 10 15
5 1 15 17
6 1 17 20