Pandas不同大小DataFrame按标签和区间匹配填充数据的问题
Pandas跨DataFrame区间匹配解决方案
你之前的代码报错是因为np.where默认按行对齐逐元素比较,两个DataFrame长度不一致时会触发广播错误,也无法实现多对多的区间匹配逻辑,以下是支持非整数步长的高性能实现方案:
方法1:IntervalIndex映射方案(性能最优)
核心思路是按Labels分组后为每个标签的区间集合构建IntervalIndex索引,直接映射匹配值,避免全量循环,适合大数据量场景:
import pandas as pd # 第一步:构建标签->区间索引的映射字典 label_interval_map = {} for label, group in df2.groupby('Labels'): # closed参数设置区间开闭规则,示例中值2属于[0,2],因此设置为'both',可按需调整为left/right/neither interval_idx = pd.IntervalIndex.from_arrays(group['From'], group['To'], closed='both') label_interval_map[label] = pd.Series(group['Data'].values, index=interval_idx) # 第二步:为df1匹配Data值 # 数据量中等场景可以用apply实现 df1['Data'] = df1.apply( lambda row: label_interval_map[row['Labels']].get(row['Interval'], pd.NA), axis=1 ) # 超大数据量可以用分组优化版,速度提升数倍 def match_group_interval(group, interval_map): return interval_map[group.name].reindex(group['Interval']).values df1['Data'] = df1.groupby('Labels', group_keys=False).apply( match_group_interval, interval_map=label_interval_map )
方法2:条件关联方案(逻辑直观)
如果数据量不大,也可以用关联+过滤的方式实现,逻辑更易理解:
# 先按Labels字段做全量关联 temp = df1.merge(df2, on='Labels', how='left') # 过滤出Interval落在[From, To]区间内的有效行 temp = temp[(temp['Interval'] >= temp['From']) & (temp['Interval'] <= temp['To'])] # 合并结果回df1 df1 = df1.merge(temp[['Labels', 'Interval', 'Data']], on=['Labels', 'Interval'], how='left')
内容的提问来源于stack exchange,提问作者Manks
相关产品推荐
相关产品推荐

