如何按价格精确匹配或±1%范围过滤Pandas DataFrame?
Pandas DataFrame 价格范围过滤实现
需求说明
现有两个结构一致的Pandas DataFrame,其中DataFrame B是DataFrame A的子集。需对DataFrame B进行过滤,仅保留以下两类行:
- 价格与DataFrame A中某一价格完全匹配
- 价格处于DataFrame A中某一价格的±1%范围内
示例数据
DataFrame A
| index | price |
|---|---|
| 0 | 20.23 |
| 1 | 10.34 |
| 2 | 5.28 |
| 3 | 12.25 |
| 4 | 12.32 |
DataFrame B
| index | price |
|---|---|
| 0 | 0.23 |
| 1 | 10.34 |
| 2 | 5.26 |
期望过滤结果
| index | price |
|---|---|
| 1 | 10.34 |
| 2 | 5.26 |
初始化代码
import pandas as pd dfA = pd.DataFrame({'index': [0, 1, 2, 3, 4], 'price': [20.23, 10.34, 5.28, 12.25, 12.32]}) dfB = pd.DataFrame({'index': [0, 1, 2], 'price': [0.23, 10.34, 5.26]})
现有问题
当前仅能实现精确匹配的代码:
dfB[dfB['price'].isin(dfA['price'])]
该代码无法覆盖价格在±1%范围内的匹配需求。
解决方案
方法1:遍历检查(适合小数据量)
通过遍历DataFrame A的价格区间,判断DataFrame B的价格是否符合条件:
# 计算DataFrame A中每个价格的±1%区间 price_ranges = dfA['price'].apply(lambda x: (x * 0.99, x * 1.01)) # 定义检查函数:判断价格是否在任意一个区间内 def check_price_in_range(price): return any(lower <= price <= upper for lower, upper in price_ranges) # 过滤DataFrame B filtered_dfB = dfB[dfB['price'].apply(check_price_in_range)] print(filtered_dfB)
方法2:广播向量运算(适合大数据量)
利用NumPy广播机制实现高效的批量判断,避免循环:
# 提取价格数组 prices_a = dfA['price'].values[:, None] # 转换为列向量,用于广播 prices_b = dfB['price'].values # 生成匹配掩码:B中每个价格是否在A中任意价格的±1%范围内 mask = ((prices_b >= prices_a * 0.99) & (prices_b <= prices_a * 1.01)).any(axis=0) # 过滤得到结果 filtered_dfB = dfB[mask] print(filtered_dfB)
两种方法运行后均会输出期望的过滤结果:
index price 1 1 10.34 2 2 5.26
内容的提问来源于stack exchange,提问作者cksrc
相关产品推荐
相关产品推荐

