You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按价格精确匹配或±1%范围过滤Pandas DataFrame?

Pandas DataFrame 价格范围过滤实现

需求说明

现有两个结构一致的Pandas DataFrame,其中DataFrame B是DataFrame A的子集。需对DataFrame B进行过滤,仅保留以下两类行:

  • 价格与DataFrame A中某一价格完全匹配
  • 价格处于DataFrame A中某一价格的±1%范围内

示例数据

DataFrame A

indexprice
020.23
110.34
25.28
312.25
412.32

DataFrame B

indexprice
00.23
110.34
25.26

期望过滤结果

indexprice
110.34
25.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:11:17