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

如何用Pandas实现两个区间型DataFrame的复杂合并

解决方案

步骤概述

要合并两个区间化的DataFrame,核心是先提取所有拆分点生成最小的不重叠区间,再为每个小区间匹配对应Value1和Value2。

代码实现

首先创建示例中的两个DataFrame:

import pandas as pd

# 表格1
table1 = pd.DataFrame({
    'From1': [0, 3, 15, 30],
    'To1': [3, 15, 30, 45],
    'Value1': [1., 2., 1., 3.]
})

# 表格2
table2 = pd.DataFrame({
    'From2': [0, 5, 11, 30],
    'To2': [5, 11, 30, 45],
    'Value2': ['b)', 'a)', 'c)', 'a)']
})

1. 提取并排序所有拆分点

收集两个表中所有区间的起止点,去重后排序,得到所有需要拆分的节点:

# 收集所有区间端点
all_points = pd.concat([
    table1[['From1', 'To1']].stack(),
    table2[['From2', 'To2']].stack()
]).unique()
# 排序端点
all_points = sorted(all_points)

2. 生成新的最小区间

用排序后的端点生成连续的From-To区间:

new_intervals = pd.DataFrame({
    'From': all_points[:-1],
    'To': all_points[1:]
})

3. 匹配对应Value1和Value2

通过判断小区间是否完全包含在原表的区间内,提取对应值:

# 匹配Value1
def map_value1(row):
    # 找到包含当前区间的table1行
    match = table1[(table1['From1'] <= row['From']) & (table1['To1'] >= row['To'])]
    return match['Value1'].iloc[0]

new_intervals['Value1'] = new_intervals.apply(map_value1, axis=1)

# 匹配Value2
def map_value2(row):
    # 找到包含当前区间的table2行
    match = table2[(table2['From2'] <= row['From']) & (table2['To2'] >= row['To'])]
    return match['Value2'].iloc[0]

new_intervals['Value2'] = new_intervals.apply(map_value2, axis=1)

4. 查看结果

运行后new_intervals即为目标表格:

From  To  Value1 Value2
0     0   3     1.0     b)
1     3   5     2.0     b)
2     5  11     2.0     a)
3    11  15     2.0     c)
4    15  30     1.0     c)
5    30  45     3.0     a)

原理说明

  • 提取所有端点是为了将两个表的区间拆分为最小的不重叠单元,确保每个单元只属于原表中的一个区间。
  • 通过区间包含判断,可以精准匹配每个小区间对应的Value1和Value2,不会出现值的冲突。

内容的提问来源于stack exchange,提问作者Alja R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:30:27