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

