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

如何在Pandas中按国家合并重叠或连续的区间行?

解决Pandas中同一国家下重叠/连续区间的合并问题

步骤说明

要实现同一国家下重叠或连续区间的合并,核心是先给需要合并的区间打上同一组标识,再按组聚合取极值,具体操作如下:

  1. 排序数据
    确保同一国家的区间按起始值升序排列,保证后续断点判断的准确性:
df = df.sort_values(['country', 'low_range'])
  1. 生成合并组标识
    在同一国家分组内,判断当前区间是否与上一区间断开(即当前区间的起始值大于上一区间的结束值+1),标记断点后生成组ID:
# 标记断点:当前区间与上一区间既不重叠也不连续时,视为新组起点
df['break_point'] = df.groupby(['Country_code', 'country']).apply(
    lambda g: g['low_range'] > g['high_range'].shift().fillna(-float('inf')) + 1
).reset_index(level=0, drop=True)

# 基于断点生成组ID,同一合并组的ID保持一致
df['group_id'] = df.groupby(['Country_code', 'country'])['break_point'].cumsum()
  1. 聚合合并区间
    按国家编码、国家名称和组ID分组,取每组的最小起始值和最大结束值,最终删除组ID列得到结果:
merged_df = df.groupby(['Country_code', 'country', 'group_id'], as_index=False).agg(
    low_range=('low_range', 'min'),
    high_range=('high_range', 'max')
).drop(columns='group_id')

逻辑解释

  • shift()用于获取上一行的区间结束值,fillna(-float('inf'))处理每组第一行的空值(确保第一行不会被误判为断点)
  • 断点判断逻辑low_range > high_range.shift() +1:只有当当前区间和上一区间完全不重叠且不连续时,才启动新组
  • 聚合时,同一组内的Country_code和country值完全一致,因此直接保留分组后的对应字段即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:53:12