Pandas如何基于多列区间条件从另一DataFrame匹配获取对应值
Pandas 区间匹配填充安全库存实现方案
推荐实现方法(基于IntervalIndex,逻辑直观无额外依赖)
该方法直接利用pandas内置的区间索引能力匹配符合条件的安全库存规则,代码简洁且性能优于逐行遍历、笛卡尔积过滤等方案。
实现步骤:
- 为安全库存配置表创建区间索引,匹配要求的
左闭右闭区间规则 - 用库存表的
FirstSeenInStock直接匹配区间索引,取出对应的安全库存值回填 - 字段名无需手动映射,只要两表同平台字段命名一致即可直接赋值
完整可运行代码:
import pandas as pd import numpy as np # 原始数据 Stock = pd.DataFrame(data={ 'SKU': [1,2,3], 'PhysicalStock': [100,1,2], 'FirstSeenInStock': [2,5,200], 'SafetyStock_Platform1': [np.nan,np.nan,np.nan], 'SafetyStock_Platform2': [np.nan,np.nan,np.nan] }) SafetyStock = pd.DataFrame(data={ 'FromAgeDays': [0,2,9], 'ToAgeDays': [3,10,999], 'SafetyStock_Platform1': [10,1,0], 'SafetyStock_Platform2': [5,3,0] }) # 1. 创建区间索引,closed='both'表示同时满足 >=左端点 <=右端点 safety_intervals = pd.IntervalIndex.from_arrays( SafetyStock['FromAgeDays'], SafetyStock['ToAgeDays'], closed='both' ) SafetyStock = SafetyStock.set_index(safety_intervals) # 2. 匹配并回填安全库存 stock_age = Stock['FirstSeenInStock'] matched_safety = SafetyStock.loc[stock_age].reset_index(drop=True) safety_cols = [col for col in SafetyStock.columns if col.startswith('SafetyStock_')] Stock[safety_cols] = matched_safety[safety_cols] # 输出结果和期望完全一致 print(Stock)
注意事项
- 请提前确认安全库存配置表的区间没有逻辑冲突,若存在多个区间同时命中的情况,会优先取配置表中排在前面的规则
- 如果存在
FirstSeenInStock没有匹配到任何区间的情况,返回值会是NaN,建议增加校验逻辑处理这类异常值
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

