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

使用pd.query比较str.count结果与标量时报numpy.ndarray不可哈希错误

问题原因

这个异常是pandas 1.x版本中query()方法对str访问器返回值的解析缺陷导致的:

  • 直接在外部执行df.x.str.count(" ")会返回元素为整型的一维Series,但在query()的内部解析逻辑中,str.count()的返回值会被错误封装为嵌套的numpy数组,而非可以直接参与广播运算的一维序列。
  • 当你尝试将该返回值与标量1做相等比较时,query()的解析器会错误尝试对整个numpy数组做哈希匹配(而非逐元素比较),而numpy数组本身是不可哈希类型,因此抛出TypeError: unhashable type: 'numpy.ndarray'。

为什么== [1]可以正常运行

当右侧改为列表[1]时,query()会触发逐元素比较的广播逻辑:首先会把左侧的嵌套数组展开为和DataFrame行数一致的一维序列,再把右侧长度为1的列表自动广播到和左侧相同长度,逐元素做比较,不会触发哈希匹配逻辑,因此可以正常运行。

推荐的替代写法

除了用列表包裹标量的写法外,你也可以用以下更易读的方案绕过该缺陷:

  • 显式将str.count的返回值转为整型,让解析器识别为可广播的一维序列:
df.query('x.str.count(" ").astype(int) == 1')
  • 用@符引入外部标量变量,规避内部解析的bug:
space_count = 1
df.query('x.str.count(" ") == @space_count')
  • 针对当前匹配恰好1个空格的场景,直接用正则匹配更高效:
df.query('x.str.contains(r"^[^ ]+ [^ ]+$")')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:54:07