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

