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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:57:23