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

Pandas匹配另一DataFrame区间值并关联对应Key2字段的实现

Pandas 区间匹配关联DataFrame实现方案

以下是两种不同数据量级下的高效实现方案:


方案1:等值merge+区间过滤(中小数据量,逻辑简单易维护)

该方案逻辑直观,适合总数据量在十万级以下的场景,只要df2中同Key1下无重叠区间即可得到正确结果。

import pandas as pd

# 构造示例df1
df1 = pd.DataFrame({
    'Value': [10, 20, 30, 40],
    'Key1': [55, 55, 35, 35]
})

# 构造示例df2
df2 = pd.DataFrame({
    'Value Initial': [10, 10],
    'Value Final': [50, 50],
    'Key1': [55, 35],
    'Key2': ['Y', 'Z']
})

# 核心实现逻辑
# 1. 按Key1做等值合并
merged = df1.merge(df2, on='Key1', how='left')
# 2. 过滤Value在区间范围内的行
df3 = merged[(merged['Value'] >= merged['Value Initial']) & (merged['Value'] <= merged['Value Final'])]
# 3. 保留需要的字段,重置索引
df3 = df3[['Value', 'Key1', 'Key2']].reset_index(drop=True)

执行后得到的df3和预期结果完全一致:

Value  Key1 Key2
0     10    55    Y
1     20    55    Y
2     30    35    Z
3     40    35    Z

方案2:IntervalIndex映射(大数据量,性能更优)

该方案利用pandas的区间索引做匹配,避免了merge产生的中间冗余数据,适合百万级以上的大数据量场景,执行效率远高于方案1。

# 先把df2按Key1分组,每组生成区间到Key2的映射
key2_map = {}
for key1, group in df2.groupby('Key1'):
    # closed='both'表示左右闭区间,包含起始和结束值,可按需调整
    interval_idx = pd.IntervalIndex.from_arrays(group['Value Initial'], group['Value Final'], closed='both')
    key2_map[key1] = pd.Series(group['Key2'].values, index=interval_idx)

# 直接对df1做匹配生成Key2
df3 = df1.copy()
df3['Key2'] = df3.apply(lambda x: key2_map[x['Key1']].loc[x['Value']], axis=1)

注意事项

  • 若同一个Key1下存在重叠区间,两种方案都会出现多匹配/报错问题,需先清洗df2的区间数据保证无重叠再执行
  • 区间的开闭规则可按需调整,如需左闭右开区间,可将IntervalIndex的closed参数修改为'left'
  • 若存在匹配不到的Value,可自行添加默认值填充逻辑,避免执行报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:48:01