用对象值填充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)
关键修改点
- 用
lambda函数封装mode逻辑:x.mode().iloc[0]确保多众数场景下只取第一个结果,加入空值判断避免分组无有效值时报错。 - 改用
set_index+to_dict的方式构建映射字典,比手动提取values更稳妥,直接规避数组类型导致的哈希问题。
补充检查建议
可以先在真实数据集上排查分组的众数情况,确认问题来源:
# 查看每个分组的众数结果 data.groupby(col_key)[col_vals].agg(lambda x: x.mode())
内容的提问来源于stack exchange,提问作者mustafa00
相关产品推荐
相关产品推荐

