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

Pandas实现街道门牌号按间隔阈值分组聚合方法

Pandas合并街道连续门牌号段问题

基础背景

现有存储街道门牌号数据的DataFrame df,包含4个核心字段:

  • street:街道名称
  • descripcion:门牌号奇偶属性,取值odd为奇数号段、even为偶数号段
  • start:门牌号段起始值
  • end:门牌号段结束值
    每一行对应城市中的一个完整街区。

核心需求:
按街道名称、门牌号奇偶属性分组,合并连续门牌号段,取各连续段的最小start与最大end作为覆盖范围;若相邻门牌号段间隔超过阈值(区间内无有效门牌号),则间隔后的段归为同街道下的独立连续序列,最终得到每条街道实际覆盖的门牌号范围,用于统计街道延伸长度。

初始实现的问题

最初尝试新增group_ids字段标记分组切换节点,再按street、descripcion、group_ids字段分组聚合,但逻辑运行异常:测试样例中本应在end值为2899的位置触发分组切换,实际提前在end值为2499的位置切换,聚合结果不符合预期。
初始错误实现代码:

df = df.sort_values(["street","descripcion","start","end"],ascending=[True,True,True,True])
df["group_ids"] = (df.end+100 < df.end.shift(periods=-1)).cumsum()
df = df.groupby(["street","descripcion","group_ids"],as_index=False).agg({"start":"min","end":"max"})

可行实现方案

调试后可正常运行的实现代码(非最优效率版本)如下:

df["diff"]= df["start"] - df["end"].shift()
df["step"]=( df["diff"] != 2).cumsum()
df=df.groupby(["street","descripcion","step"],as_index=False).agg({"start":"min","end":"max"})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:48:16