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

在Pandas中求区间交集:匹配两DataFrame同值区间

解决两个区间DataFrame的同值区间提取问题

咱先来拆解需求:要把两个带区间的DataFrame拆成更细的不重叠子区间,逐个判断每个子区间在两个原表中的Value是否一致,最后整理成包含区间范围、同值标记、两表对应Value的新DataFrame。

核心思路

  1. 收集两个表中所有的区间分界点(Start和Stop值),去重排序后得到所有需要拆分的节点
  2. 用这些节点生成所有连续的子区间
  3. 对每个子区间,找到它在两个原表中对应的Value
  4. 比较两表的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:31:52