在Pandas中求区间交集:匹配两DataFrame同值区间
解决两个区间DataFrame的同值区间提取问题
咱先来拆解需求:要把两个带区间的DataFrame拆成更细的不重叠子区间,逐个判断每个子区间在两个原表中的Value是否一致,最后整理成包含区间范围、同值标记、两表对应Value的新DataFrame。
核心思路
- 收集两个表中所有的区间分界点(Start和Stop值),去重排序后得到所有需要拆分的节点
- 用这些节点生成所有连续的子区间
- 对每个子区间,找到它在两个原表中对应的
Value - 比较两表的
Value,生成同值标记(1=相同,0=不同)
实操代码(Pandas实现)
import pandas as pd # 定义原始的两个DataFrame df_a = pd.DataFrame({ 'Start': [0, 101, 201], 'Stop': [100, 200, 1000], 'Value': [0.0, 1.0, 0.0] }) df_b = pd.DataFrame({ 'Start': [0, 51, 301], 'Stop': [50, 300, 1000], 'Value': [0.0, 1.0, 0.0] }) # 步骤1:收集所有拆分分界点(两表的Start/Stop去重排序) all_points = pd.concat([df_a[['Start', 'Stop']].stack(), df_b[['Start', 'Stop']].stack()]).unique() all_points.sort() # 步骤2:生成所有连续子区间 sub_intervals = [] for i in range(len(all_points)-1): start, stop = all_points[i], all_points[i+1] if start < stop: # 跳过空区间(去重后基本不会出现) sub_intervals.append({'Start': start, 'Stop': stop}) df_out = pd.DataFrame(sub_intervals) # 步骤3:辅助函数——根据子区间中点获取原表的Value def get_interval_value(df, interval_start, interval_stop): # 取区间中点,确保落在原表的某个完整区间内 mid = (interval_start + interval_stop) / 2 return df[(df['Start'] <= mid) & (mid <= df['Stop'])]['Value'].iloc[0] # 给结果表添加两表的Value列 df_out['Value_dfA'] = df_out.apply(lambda row: get_interval_value(df_a, row['Start'], row['Stop']), axis=1) df_out['Value_dfB'] = df_out.apply(lambda row: get_interval_value(df_b, row['Start'], row['Stop']), axis=1) # 步骤4:生成同值标记列 df_out['SameValue'] = df_out.apply(lambda row: 1 if row['Value_dfA'] == row['Value_dfB'] else 0, axis=1) # 调整列顺序,和示例一致 df_out = df_out[['Start', 'Stop', 'SameValue', 'Value_dfA', 'Value_dfB']] # 查看最终结果 print(df_out)
运行结果
Start Stop SameValue Value_dfA Value_dfB 0 0 50 1 0.0 0.0 1 51 100 0 0.0 1.0 2 101 200 1 1.0 1.0 3 201 300 0 0.0 1.0 4 301 1000 1 0.0 0.0
关键细节说明
- 用区间中点找原表Value:因为子区间是从原表的分界点拆分出来的,每个子区间必然完全落在原表的某一个区间内,中点能100%命中对应区间,避免边界判断的麻烦。
- 自动处理所有边界:不管原表的区间怎么划分,只要收集所有分界点,就能自动拆分出所有需要比较的子区间。
内容的提问来源于stack exchange,提问作者00__00__00
相关产品推荐
相关产品推荐

