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

Pandas两个DataFrame外连接报错TypeError: unhashable type: 'numpy.ndarray'

问题根因

报错TypeError: unhashable type: 'numpy.ndarray'的核心原因是:你用作合并关联键的列中,至少有一列的单元格存储的是numpy数组类型的值。pandas合并时需要对关联键做哈希映射匹配行,而可变类型的numpy数组不支持哈希计算,因此触发报错。

定位问题列的方法

先把所有关联键统一存为一个变量,再分别检查两个DataFrame的关联列是否包含numpy数组元素:

import numpy as np

join_cols = common_cols + ['reference_lcm_name', 'dwnstrm_plant', 'frequency', 'eia', 'source_id']

# 检查左表digiplay_video_services_t
print("=====左表关联列检查结果=====")
for col in join_cols:
    has_ndarray = any(isinstance(x, np.ndarray) for x in digiplay_video_services_t[col])
    if has_ndarray:
        print(f"左表列【{col}】包含numpy数组元素")

# 检查右表dsr_conflict_df
print("=====右表关联列检查结果=====")
for col in join_cols:
    has_ndarray = any(isinstance(x, np.ndarray) for x in dsr_conflict_df[col])
    if has_ndarray:
        print(f"右表列【{col}】包含numpy数组元素")

运行后即可定位到具体的问题列。

解决方法

根据业务场景选择对应处理方案:

  • 若数组仅包含1个元素,属于之前操作误转成数组的情况:直接提取标量值即可
# 假设定位到的问题列是frequency,两个表的问题列都做相同处理
digiplay_video_services_t['frequency'] = digiplay_video_services_t['frequency'].apply(lambda x: x[0] if isinstance(x, np.ndarray) else x)
dsr_conflict_df['frequency'] = dsr_conflict_df['frequency'].apply(lambda x: x[0] if isinstance(x, np.ndarray) else x)
  • 若数组包含多个元素,需要以整个数组作为关联键:把数组转成可哈希的元组类型
# 假设定位到的问题列是source_id,两个表的问题列都做相同处理
digiplay_video_services_t['source_id'] = digiplay_video_services_t['source_id'].apply(lambda x: tuple(x) if isinstance(x, np.ndarray) else x)
dsr_conflict_df['source_id'] = dsr_conflict_df['source_id'].apply(lambda x: tuple(x) if isinstance(x, np.ndarray) else x)
  • 若数组属于脏数据:结合业务逻辑删除异常行、或者填充合法的默认值后再合并。
代码优化提示

你当前写法中left_on和right_on使用完全相同的列名,可以直接简化为on参数,代码更简洁不易出错:

dsr_digiplay_conflicts = pd.merge(
    digiplay_video_services_t, 
    dsr_conflict_df,
    on = join_cols, 
    how = 'outer', 
    indicator = True
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:15:00