You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. 生成分组键:df.groupby('route')['val'].diff().ne(0)会判断当前行与上一行的val是否不同,cumsum()将连续相同的val行标记为同一组。
  2. 分组聚合:按route和group分组后,frm取组内第一个值,to取组内最后一个值,val取组内任意值(因为组内val完全相同)。
  3. 调整索引:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:30:39