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

Pandas 0.23多条件查询返回空DataFrame求助(0.22可正常运行)

解决Pandas 0.23版本布尔索引返回空DataFrame的问题

这个问题我之前碰到过类似的情况,大概率是Pandas 0.23版本在数据类型比较逻辑或浮点数精度处理上的调整导致的,咱们一步步来排查解决:

核心问题分析

  1. 浮点数精度误差:你的strike值是124.5,看起来是精确值,但如果DataFrame中该列存储为二进制浮点数(比如float64),可能存在肉眼不可见的精度偏差。Pandas 0.22版本可能对浮点数比较做了宽松处理,而0.23版本则严格遵循精确匹配,导致原本能匹配的行被过滤掉。
  2. 日期类型不匹配:如果expiry_date列是datetime64[ns]类型,而你用dt.date()生成的日期对象直接比较,0.23版本可能不再自动做类型转换,导致日期匹配失败。

具体解决方案

方案1:用近似比较替代浮点数精确匹配

使用numpy.isclose()方法允许微小的精度误差,替代直接的==比较:

import numpy as np
import datetime as dt

exp_date = dt.date(2012, 12, 21)
code = 'CBT_21_F2013_S'
option_type = 'P'  # 避免用type作为变量名,它是Python内置关键字
strike = 124.5

result = symbols.loc[
    (symbols.expiry_date == exp_date) & 
    (symbols.code == code) & 
    (symbols.type == option_type) & 
    (np.isclose(symbols.strike, strike))
]

方案2:统一日期类型,避免类型不匹配

把exp_date转换为pd.Timestamp类型,和DataFrame中的expiry_date类型保持一致:

import pandas as pd
import datetime as dt

exp_date = pd.Timestamp(dt.date(2012, 12, 21))
code = 'CBT_21_F2013_S'
option_type = 'P'
strike = 124.5

result = symbols.loc[
    (symbols.expiry_date == exp_date) & 
    (symbols.code == code) & 
    (symbols.type == option_type) & 
    (np.isclose(symbols.strike, strike))
]

方案3:用query()方法简化查询(可选)

Pandas的query()语法更简洁,有时能规避类型匹配的隐性问题:

result = symbols.query(
    "expiry_date == @exp_date and code == @code and type == @option_type and abs(strike - @strike) < 1e-6"
)

辅助排查步骤

你可以先执行以下代码确认问题根源:

# 查看各列的数据类型
print(symbols.dtypes)

# 检查strike列的实际存储值,是否存在精度偏差
print(symbols[symbols.strike.round(1) == 124.5]['strike'].values)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:52:35