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

用对象值填充NaN报错:unhashable type: 'numpy.ndarray' 求排查

问题排查:填充缺失值时出现TypeError: unhashable type: 'numpy.ndarray'

问题原因

  • 核心问题出在pd.Series.mode的返回值特性:当某一年度的分类列存在多个出现次数相同的众数时,mode会返回一个numpy.ndarray而非单个标量值。
  • 你的代码中直接提取分组结果的values构建字典,当value包含ndarray时,这种不可哈希的类型会触发报错。测试集里每个分组只有一个众数,所以没暴露问题,但真实数据集存在多众数的分组。

修复方案

修改分类列的众数计算逻辑,确保每个分组只返回单个值(比如取第一个众数),同时优化字典构建方式:

修改后的代码

import numpy as np
import pandas as pd

dataset = {'song_year': ['1999', '2000', '2000', '2000','2000'],
        'song_popularity': [20.0, 33.8, 19.1, np.nan, 55.9],
        'country': ['USA', 'Japan', 'Japan', 'Italy', np.nan]}
 
df = pd.DataFrame(dataset)


def mapNullsWithValues(data, col_key, col_vals):
    
    to_df = pd.DataFrame()
    
    if data[col_vals].dtype in [object, 'category']:
        # 处理多众数情况,取每个分组的第一个众数,同时兼容分组无有效值的场景
        to_df = data.groupby(col_key)[col_vals].agg(
            lambda x: x.mode().iloc[0] if not x.mode().empty else np.nan
        ).to_frame().reset_index()
    elif data[col_vals].dtype in ['float64', 'int64']:
        to_df = data.groupby(col_key)[col_vals].median().to_frame().reset_index()
    
    # 直接用索引构建字典,避免手动提取values的类型问题
    dictionary = to_df.set_index(col_key)[col_vals].to_dict()
    
    data[col_vals].fillna(data[col_key].map(dictionary), inplace=True)
 
   
mapNullsWithValues(df, 'song_year', 'country')    
mapNullsWithValues(df, 'song_year', 'song_popularity') 
print(df)

关键修改点

  1. 用lambda函数封装mode逻辑:x.mode().iloc[0]确保多众数场景下只取第一个结果,加入空值判断避免分组无有效值时报错。
  2. 改用set_index+to_dict的方式构建映射字典,比手动提取values更稳妥,直接规避数组类型导致的哈希问题。

补充检查建议

可以先在真实数据集上排查分组的众数情况,确认问题来源:

# 查看每个分组的众数结果
data.groupby(col_key)[col_vals].agg(lambda x: x.mode())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:25:13