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

