Python和Pandas新手。我有以下数据框,我希望能够比较行,其中路由和vals在前一行/行中是相同的,并相应地更新from和to。
DF:
route frm to val
0 1 0 100 3
1 1 100 300 2
2 1 300 500 3
3 1 500 9999 3
4 2 0 100 3
5 2 100 300 3
6 2 300 500 3
7 2 500 9999 3
Desired Output:
route frm to val
0 1 0 100 3
1 1 100 300 2
3 1 300 9999 3
7 2 0 9999 3
我已经尝试了以下使用shift()
的方法,它让我得到了一些方法,但我不确定如何实现所需输出的最佳方法。
如有任何建议,不胜感激。
df['f'] = np.where((df.route.eq(df.route.shift())) & (df.val == df.val.shift()),df.frm.shift(),df.frm)
df['t'] = np.where((df.route.eq(df.route.shift())) & (df.val == df.val.shift()),df.to.shift(),df.to)
Output:
route frm to val f t
0 1 0 100 3 0 100
1 1 100 300 2 100 300
2 1 300 500 3 300 500
3 1 500 9999 3 300 500
4 2 0 100 3 0 100
5 2 100 300 3 0 100
6 2 300 500 3 100 300
7 2 500 9999 3 300 500
使用自定义groupby.agg
:
(df.groupby(['route', df['val'].ne(df['val'].shift()).cumsum()],
as_index=False)
.agg({'route': 'first',
'frm': 'first',
'to': 'last',
'val': 'last'})
)
输出:
route frm to val
0 1 0 100 3
1 1 100 300 2
2 1 300 9999 3
3 2 0 9999 3