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

如何按指定列连续重复值范围合并pandas DataFrame并生成pos起止区间

pandas连续相同行合并区间实现方案

原代码问题说明

你原来的写法使用全局去重逻辑duplicated,只会识别所有A、B列取值组合唯一的行,不会判断行是否连续,一旦后续重复出现之前出现过的A、B组合,就会被错误合并到最早的同组合分组中,完全不符合连续行合并的需求。

正确实现代码

import pandas as pd

# 生成测试DataFrame
test_df = pd.DataFrame({'pos' : [x for x in range(10)],
                        'A' : ['foo' for x in range(5)] + ['bar' for x in range(5)],
                        'B' : ['foo' for x in range(3)] + ['bar' for x in range(7)]})

# 生成连续相同A/B的分组标签:当前行和上一行A/B有一个不同就新开一个分组
test_df['group_id'] = ((test_df['A'] != test_df['A'].shift()) | (test_df['B'] != test_df['B'].shift())).cumsum()

# 按分组聚合得到起止区间
result = test_df.groupby('group_id', as_index=False).agg(
    start = ('pos', 'min'),
    # 完全匹配你给出的预期输出:非最后一组取左闭右开的右边界,最后一组取最大pos值
    stop = ('pos', lambda x: x.max() + 1 if x.name != test_df['group_id'].max() else x.max()),
    A = ('A', 'first'),
    B = ('B', 'first')
).drop(columns='group_id')

print(result)

运行输出结果

start  stop    A    B
0      0     3  foo  foo
1      3     5  foo  bar
2      5     9  bar  bar

和你给出的预期结果完全一致。如果后续需要统一使用左闭右开区间,只需要把stop的聚合逻辑改成lambda x: x.max()+1即可。

内容的提问来源于stack exchange,提问作者curious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:36:03