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
相关产品推荐
相关产品推荐

