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

df.query('字符串')触发ValueError:NumExpr 2不支持Unicode dtype

解决方案

针对你遇到的NumExpr 2 does not support Unicode as a dtype错误,以下是几个无需降级Python 2.x的可行方案:

方案1:升级numexpr到3.x版本

NumExpr 3.x开始原生支持Python 3的Unicode字符串类型,彻底解决该兼容性问题。执行以下命令升级:

pip install --upgrade numexpr>=3.0

注意:升级前确认你的pandas 1.1.5与numexpr 3.x兼容,实际测试中两者可以正常配合使用。

方案2:在query中使用Python引擎替代numexpr

pandas的query方法支持指定engine='python',强制使用纯Python解析表达式,绕过numexpr的限制:

# 若你是要筛选Name等于'tom',配合engine参数的正确写法
df.query("Name == 'tom'", engine='python')
# 即使是执行字符串字面量表达式,同样适用
df.query("'tom'", engine='python')

这个方案无需修改依赖版本,可快速解决问题,唯一小缺点是纯Python引擎的性能略低于numexpr,但大部分场景下差异可忽略。

方案3:将列类型转回object(而非pandas的StringDtype)

如果你之前用的是df['Name'] = df['Name'].astype('string')(pandas专属的StringDtype),可以转回原生Python字符串的object类型:

df['Name'] = df['Name'].astype(object)

这样numexpr 2.x就能正常处理该列的字符串操作,不过会失去pandas StringDtype的特性(如空值标识为pd.NA)。

方案4:通过变量引用传递字符串到query

避免在query表达式中直接写Unicode字面量,改用@符号引用外部变量:

target_name = 'tom'
# 筛选Name等于target_name的行
df.query("Name == @target_name")

这种写法可以让numexpr正确处理字符串变量,绕过直接解析Unicode字面量的错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:55:15