pandas groupby报TypeError: unhashable type: 'dict'的解决方法
报错根因
pandas 执行 groupby 操作时,要求分组维度的所有值必须是可哈希类型。dict 是可变容器,天生不支持哈希计算,只要分组列里存在 dict 类型值,就会抛出 TypeError: unhashable type: 'dict'。
你之前的处理逻辑有两个问题:
- 查找含 dict 的列时,只判断了每列第一行的值,只要某列第一行不是 dict、后续行存在 dict 值,就会漏处理;另外代码里的
dfd是笔误,正确对象名是df - 直接对整列调用
astype(str)在部分 pandas 版本中不会逐元素做类型转换,可能残留 dict 对象引用,依然会触发哈希错误
解决方法
方案1:统一转换dict列为可哈希类型(推荐,兼容性最好)
先逐列扫描所有值,准确找出所有包含 dict 类型的列,再逐元素做类型转换,不要只检查第一行:
# 识别所有包含dict值的列 col_with_dict = [] for col in df.columns: if df[col].apply(lambda x: isinstance(x, dict)).any(): col_with_dict.append(col) # 逐元素将dict转为可哈希的字符串,非dict值保持不变 df[col_with_dict] = df[col_with_dict].applymap( lambda x: str(x) if isinstance(x, dict) else x )
如果后续需要还原dict结构,转换时不要用str(),可以把dict转为排序后的键值对元组(同内容的dict不管键顺序如何,排序后生成的元组一致,不会出现同值被分到不同组的问题):
df[col_with_dict] = df[col_with_dict].applymap( lambda x: tuple(sorted(x.items())) if isinstance(x, dict) else x )
转换完成后直接执行原有groupby逻辑即可:
cols = ['col1','col2'] df = df.groupby(cols, as_index=False).agg({'r': lambda x: list(x)})
方案2:分组时临时转换,不修改原数据
如果不想改动原DataFrame里的dict值,可以构造临时分组键传入groupby,分组完成后再还原列名:
cols = ['col1','col2'] temp_group_keys = [] for col in cols: # 对分组列里的dict值临时转字符串,其他值保留原格式 temp_col = df[col].apply(lambda x: str(x) if isinstance(x, dict) else x) temp_group_keys.append(temp_col) # 用临时分组键执行聚合 df = df.groupby(temp_group_keys, as_index=False).agg({'r': lambda x: list(x)}) # 还原分组列的原名 df.columns = cols + ['r']
注意:如果dict中嵌套了list、子dict等其他不可哈希类型,优先选择转字符串的方案;转元组的方案需要递归处理所有嵌套的不可哈希类型,否则仍会触发哈希报错。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

