Pandas DataFrame按两列排序时报TypeError: unhashable type: 'numpy.ndarray'
报错原因
这个TypeError: unhashable type: 'numpy.ndarray'报错的根因是:pandas做多列排序时,需要将多列的值组合为可哈希的元组完成排序比较,如果参与排序的列名/列值中存在不可哈希的numpy数组类型元素,就会触发报错。而单列排序时不需要做跨列的元组组合,因此不会触发对应检查,可以正常运行。
解决步骤
步骤1:排查并修复异常类型
- 首先检查列名是否为numpy字符串类型而非Python原生字符串,执行以下代码将列名统一转为原生字符串:
df.columns = df.columns.astype(str)
- 再检查两列的元素是否混入了numpy数组,执行以下代码将两列值统一转为字符串标量:
df['Country'] = df['Country'].astype(str) df['Sample'] = df['Sample'].astype(str)
完成转换后再执行原来的排序代码即可正常运行:
df_sorted = df.sort_values(by=['Country','Sample'])
步骤2:替代排序方案(可选)
如果上述转换后仍然报错,可以通过构造排序键的方式绕过底层类型检查,实现相同的双列排序效果:
# 构造双列组合排序键 df['sort_key'] = df.apply(lambda row: (row['Country'], row['Sample']), axis=1) # 按键排序后删除临时键列 df_sorted = df.sort_values(by='sort_key').drop('sort_key', axis=1)
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

