Pandas合并同Route同Val连续行:更新frm与to字段
问题:合并同一route下val值相同的连续行
我是Python和Pandas新手,需要合并同一route下val值相同的连续行,并更新frm为组内第一个值,to为组内最后一个值。
原始DataFrame
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
期望输出
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()方法写了代码,但只实现部分效果:
import numpy as np 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)
代码输出:
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
解决方案
可以通过标记连续相同val的分组,再分组聚合的方式实现需求:
import pandas as pd # 构建原始DataFrame data = { 'route': [1,1,1,1,2,2,2,2], 'frm': [0,100,300,500,0,100,300,500], 'to': [100,300,500,9999,100,300,500,9999], 'val': [3,2,3,3,3,3,3,3] } df = pd.DataFrame(data) # 生成分组键:同一route下,连续相同val的行归为一组 df['group'] = df.groupby('route')['val'].diff().ne(0).cumsum() # 分组聚合:取每组第一个frm、最后一个to,val取组内任意值(因为组内一致) result = df.groupby(['route', 'group']).agg( frm=('frm', 'first'), to=('to', 'last'), val=('val', 'first') ).reset_index(level='group', drop=True) # 调整索引为原始数据中每组最后一行的索引(匹配期望输出的索引) last_indices = df.groupby(['route', 'group']).tail(1).index result.index = last_indices print(result)
代码说明
- 生成分组键:
df.groupby('route')['val'].diff().ne(0)会判断当前行与上一行的val是否不同,cumsum()将连续相同的val行标记为同一组。 - 分组聚合:按
route和group分组后,frm取组内第一个值,to取组内最后一个值,val取组内任意值(因为组内val完全相同)。 - 调整索引:通过
tail(1).index获取每组最后一行的原始索引,赋值给结果,与期望输出的索引一致。
运行后输出:
route frm to val 0 1 0 100 3 1 1 100 300 2 3 1 300 9999 3 7 2 0 9999 3
内容的提问来源于stack exchange,提问作者FizzyGood
相关产品推荐
相关产品推荐

