如何基于DataFrame中两列的区间为其添加新行?
问题描述
我有一个记录大型网络轨道段的DataFrame,每个轨道段有唯一的segment_id,数据如下:
import pandas as pd import numpy as np my_dict = { 'segment_id':['a', 'b', 'c', 'd', 'e'], 'km_start':[2,4,9,15,20], 'km_end':[3,7,11,16,22], 'min_km_start':[0,0,0,0,0], 'max_km_end':[25,25,25,25,25] } df = pd.DataFrame(my_dict)
原始DataFrame输出:
segment_id km_start km_end min_km_start max_km_end 0 a 2 3 0 25 1 b 4 7 0 25 2 c 9 11 0 25 3 d 15 16 0 25 4 e 20 22 0 25
需要完成的操作:找出现有轨道段的[km_start, km_end]与整个网络的[min_km_start, max_km_end]之间的间隙,为每个间隙生成新行,segment_id从-1开始按降序填充,最终合并所有行并按km_start排序。
期望输出:
segment_id km_start km_end min_km_start max_km_end 0 -1 0 2 0 25 1 a 2 3 0 25 2 -2 3 4 0 25 3 b 4 7 0 25 4 -3 7 9 0 25 5 c 9 11 0 25 6 -4 11 15 0 25 7 d 15 16 0 25 8 -5 16 20 0 25 9 e 20 22 0 25 10 -6 22 25 0 25
解决方案
可以通过以下步骤实现需求:
- 提取全局的起始和终止公里数(所有行的
min_km_start和max_km_end一致,直接取第一行值即可) - 收集所有关键公里节点:全局起始、现有轨道的所有
km_end、所有km_start、全局终止 - 对节点去重排序后,生成有效间隙区间
- 为间隙创建新DataFrame,按规则设置
segment_id - 合并原数据与间隙数据,按
km_start排序
代码实现:
import pandas as pd import numpy as np # 原始数据 my_dict = { 'segment_id':['a', 'b', 'c', 'd', 'e'], 'km_start':[2,4,9,15,20], 'km_end':[3,7,11,16,22], 'min_km_start':[0,0,0,0,0], 'max_km_end':[25,25,25,25,25] } df = pd.DataFrame(my_dict) # 获取全局公里范围 global_start = df['min_km_start'].iloc[0] global_end = df['max_km_end'].iloc[0] # 收集所有关键公里节点并去重排序 nodes = sorted(list(set([global_start] + df['km_end'].tolist() + df['km_start'].tolist() + [global_end]))) # 生成间隙数据 gaps = [] for idx in range(len(nodes)-1): start = nodes[idx] end = nodes[idx+1] if start < end: gaps.append({ 'segment_id': f'-{idx+1}', 'km_start': start, 'km_end': end, 'min_km_start': global_start, 'max_km_end': global_end }) # 合并数据并排序 result = pd.concat([df, pd.DataFrame(gaps)]).sort_values('km_start').reset_index(drop=True) print(result)
内容的提问来源于stack exchange,提问作者Amir Charkhi
相关产品推荐
相关产品推荐

