如何在Pandas中按国家合并重叠或连续的区间行?
解决Pandas中同一国家下重叠/连续区间的合并问题
步骤说明
要实现同一国家下重叠或连续区间的合并,核心是先给需要合并的区间打上同一组标识,再按组聚合取极值,具体操作如下:
- 排序数据
确保同一国家的区间按起始值升序排列,保证后续断点判断的准确性:
df = df.sort_values(['country', 'low_range'])
- 生成合并组标识
在同一国家分组内,判断当前区间是否与上一区间断开(即当前区间的起始值大于上一区间的结束值+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()
- 聚合合并区间
按国家编码、国家名称和组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
相关产品推荐
相关产品推荐

