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

如何基于df1的价格从df2提取对应产品的指定价格范围行?

解决DataFrame产品价格区间匹配问题

首先得说下你之前代码里的几个问题,这些是导致失败的主要原因:

  • 嵌套循环遍历大型DataFrame效率极低,数据量大的话会慢到离谱
  • 变量名有错误(比如np2L应该是np2,还有MD根本没定义,应该是基于pr1的上下限吧?)
  • 每次循环直接赋值df3 = df2[...],会把之前的结果完全覆盖,根本没实现累加
  • .ix已经被Pandas弃用了,现在不推荐用这个方法

针对你的需求,最适合大型DataFrame的高效方法是用merge关联+矢量化过滤,比循环快N倍,逻辑也更清晰,具体步骤如下:

步骤说明

  1. 先把两个DataFrame按产品关联起来:用pd.merge匹配df1的product和df2的product1,这样每个df2的行都会带上对应df1的价格
  2. 筛选价格符合±5区间的行:直接判断df2的price1是否在df1.price-5到df1.price+5之间
  3. 整理结果:如果只需要保留df2原来的列,直接提取即可

具体代码

import pandas as pd

# 1. 关联两个DataFrame,只保留产品匹配的行(inner join)
merged_data = pd.merge(
    df1, 
    df2, 
    left_on='product',  # df1的产品列名
    right_on='product1',  # df2的产品列名
    how='inner'
)

# 2. 过滤价格在±5区间内的行
filtered_data = merged_data[
    (merged_data['price1'] >= merged_data['price'] - 5) & 
    (merged_data['price1'] <= merged_data['price'] + 5)
]

# 3. 提取df2的原始列到df3(如果不需要df1的列)
df3 = filtered_data[df2.columns.tolist()]

如果你非要用循环(不推荐大型数据)

如果坚持想用循环实现,得修正原来的逻辑,比如不要覆盖df3,而是用concat累加结果:

df3 = pd.DataFrame()
for _, row_df1 in df1.iterrows():
    target_product = row_df1['product']
    price_lower = row_df1['price'] - 5
    price_upper = row_df1['price'] + 5
    
    # 筛选df2中符合条件的行
    temp_rows = df2[
        (df2['product1'] == target_product) &
        (df2['price1'] >= price_lower) &
        (df2['price1'] <= price_upper)
    ]
    
    # 追加到df3,注意ignore_index重置索引
    df3 = pd.concat([df3, temp_rows], ignore_index=True)

不过再次强调,这个方法对于大型DataFrame效率极低,能不用就不用。

内容的提问来源于stack exchange,提问作者user12977758

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:17:42