如何基于df1的价格从df2提取对应产品的指定价格范围行?
解决DataFrame产品价格区间匹配问题
首先得说下你之前代码里的几个问题,这些是导致失败的主要原因:
- 嵌套循环遍历大型DataFrame效率极低,数据量大的话会慢到离谱
- 变量名有错误(比如
np2L应该是np2,还有MD根本没定义,应该是基于pr1的上下限吧?) - 每次循环直接赋值
df3 = df2[...],会把之前的结果完全覆盖,根本没实现累加 .ix已经被Pandas弃用了,现在不推荐用这个方法
针对你的需求,最适合大型DataFrame的高效方法是用merge关联+矢量化过滤,比循环快N倍,逻辑也更清晰,具体步骤如下:
步骤说明
- 先把两个DataFrame按产品关联起来:用
pd.merge匹配df1的product和df2的product1,这样每个df2的行都会带上对应df1的价格 - 筛选价格符合±5区间的行:直接判断df2的
price1是否在df1.price-5到df1.price+5之间 - 整理结果:如果只需要保留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
相关产品推荐
相关产品推荐

