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
相关产品推荐
相关产品推荐

