pandas使用eval()操作pd.Int64Dtype()可空整数类型报错如何解决?
问题根因
pandas 1.2.5版本的eval()方法默认使用numexpr作为计算引擎,而numexpr至今不支持pandas自定义的可空扩展数据类型(包括Int64Dtype、BooleanDtype、StringDtype等),因此直接对可空类型列执行eval表达式会触发类型解析报错。直接对列做算术运算时走的是pandas原生的运算逻辑,不存在兼容性问题,所以不会报错。
可行解决方案
方案1:指定使用Python引擎(改动最小,推荐)
调用eval()时显式指定engine='python',切换到pandas原生运算逻辑,完美兼容可空数据类型,同时保留NA值的特性:# 运行正常,返回结果为Int64类型,保留空值 df.eval("2 * x", engine='python')仅有的缺点是处理超大规模数据时,性能会比numexpr引擎稍低,常规业务场景下基本感知不到差异。
方案2:转换为numpy原生类型(适用于必须使用numexpr引擎的场景)
如果你的数据列中没有NA值,可以先把可空Int64类型转换为numpy原生的int64类型,再执行eval:# 无NA值时使用 df['x'] = df['x'].astype('int64') df.eval("2 * x")如果列中存在NA值,需要转换为float64类型(numpy原生int类型不支持空值):
# 有NA值时使用,空值会转为nan df['x'] = df['x'].astype('float64') df.eval("2 * x")方案3:升级pandas版本
升级到pandas 2.0及以上版本,对可空类型的兼容性有明显优化,部分场景下eval可以自动兼容可空类型,但仍建议优先使用方案1指定引擎,避免不同环境的兼容性问题。
内容的提问来源于stack exchange,提问作者saiwing
相关产品推荐
相关产品推荐

