Pandas 0.23多条件查询返回空DataFrame求助(0.22可正常运行)
解决Pandas 0.23版本布尔索引返回空DataFrame的问题
这个问题我之前碰到过类似的情况,大概率是Pandas 0.23版本在数据类型比较逻辑或浮点数精度处理上的调整导致的,咱们一步步来排查解决:
核心问题分析
- 浮点数精度误差:你的
strike值是124.5,看起来是精确值,但如果DataFrame中该列存储为二进制浮点数(比如float64),可能存在肉眼不可见的精度偏差。Pandas 0.22版本可能对浮点数比较做了宽松处理,而0.23版本则严格遵循精确匹配,导致原本能匹配的行被过滤掉。 - 日期类型不匹配:如果
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
相关产品推荐
相关产品推荐

