如何基于另一个DataFrame的单行数据查询筛选Python DataFrame
错误原因
你原来的查询代码出错有几个核心问题:
- pandas的
query()方法不支持自定义的within range语法,范围匹配需要用绝对值差值小于阈值的逻辑实现 - 引用外部DataFrame(df2)的变量需要加
@前缀,不能直接写g.0['NIY']这类非标准语法 - 存在引号嵌套冲突、字段名大小写错误(你写的
Purchase_price和实际字段名Purchase_Price不一致)、数字带千位逗号的语法问题
正确实现代码
方案1:使用query方法实现
先提取df2的基准值,再通过@引用外部变量完成筛选:
# 提取df2首行的基准值 target_niy = df2['NIY'].iloc[0] target_price = df2['Purchase_Price'].iloc[0] # 差值在阈值以内等价于 abs(当前值 - 基准值) ≤ 阈值 # 如果你实际需求的NIY差值阈值是代码里写的0.01,把下方的0.1替换为0.01即可 filtered_df = df1.query('abs(NIY - @target_niy) <= 0.1 and abs(Purchase_Price - @target_price) <= 2000000')
方案2:直接使用布尔索引(可读性更高,无引号嵌套坑)
target_niy = df2['NIY'].iloc[0] target_price = df2['Purchase_Price'].iloc[0] # 构造筛选掩码 mask = (abs(df1['NIY'] - target_niy) <= 0.1) & (abs(df1['Purchase_Price'] - target_price) <= 2000000) filtered_df = df1[mask]
补充说明
如果你需要保留之前写的Purchase_Price > 1000000 & NIY > 0.09前置筛选条件,可以直接合并到筛选逻辑中:
mask = (df1['Purchase_Price'] > 1000000) & (df1['NIY'] > 0.09) & (abs(df1['NIY'] - target_niy) <= 0.1) & (abs(df1['Purchase_Price'] - target_price) <= 2000000) filtered_df = df1[mask]
内容的提问来源于stack exchange,提问作者Alex B
相关产品推荐
相关产品推荐

