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

如何基于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
解决方案

可以通过以下步骤实现需求:

  1. 提取全局的起始和终止公里数(所有行的min_km_start和max_km_end一致,直接取第一行值即可)
  2. 收集所有关键公里节点:全局起始、现有轨道的所有km_end、所有km_start、全局终止
  3. 对节点去重排序后,生成有效间隙区间
  4. 为间隙创建新DataFrame,按规则设置segment_id
  5. 合并原数据与间隙数据,按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:15:42