如何在Pandas中为DataFrame值匹配最接近的上下限对应列
高效实现:为DataFrame每个值匹配最接近的上下限列名
数据定义
import pandas as pd import numpy as np df2 = pd.DataFrame({ 5000: [1000,1500,2000,2500,3000,3500,4000,5000], 10000: [1000,2000,3000,5000,7500,8500,95000,10000], 100000: [1000,2000,5000,10000,20000,50000,75000,100000] }) df1 = pd.DataFrame({'value': [2000,45000,4000,20000]})
需求说明
针对df1中的每个value值,在df2的列名中找到:
- 最接近且小于该值的列名(若不存在则为NaN)
- 最接近且大于该值的列名(若不存在则为NaN)
高效实现方案
利用numpy的向量化搜索操作,避免逐行循环,大幅提升处理效率:
# 提取并排序df2的列名(确保逻辑通用性,即使列名无序也能正常工作) cols = np.sort(df2.columns.values) # 用searchsorted快速定位每个value在列名数组中的插入位置 positions = np.searchsorted(cols, df1['value'], side='left') # 根据位置生成上下限结果 df1['closest_lower'] = np.where(positions == 0, np.nan, cols[positions - 1]) df1['closest_upper'] = np.where(positions == len(cols), np.nan, cols[positions])
输出结果
执行后df1的内容如下:
| value | closest_lower | closest_upper | |
|---|---|---|---|
| 0 | 2000 | NaN | 5000 |
| 1 | 45000 | 10000 | 100000 |
| 2 | 4000 | NaN | 5000 |
| 3 | 20000 | 10000 | 100000 |
方案优势
使用numpy的向量化操作替代Python循环,在处理大规模数据时性能提升明显,同时代码简洁易维护,逻辑通用(无需依赖列名的初始排序)。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

