使用Python的scorecardpy.woebin时遇TypeError: unhashable type: 'numpy.ndarray'问题排查
问题描述
Python的scorecardpy库是R语言scorecardpy包的替代工具,用于评分卡开发。执行WOE分箱代码时,部分变量报错,其余变量可正常分箱。
执行的分箱代码:
bins = sc.woebin(df_temp, y=target_var, positive='bad|1') # df_temp是所有列均为float64类型的DataFrame # y是int类型的二元变量
报错信息:
TypeError: unhashable type: 'numpy.ndarray'
已尝试通过空值、数据类型、形状等维度排查报错变量与成功分箱变量的差异,执行代码如下:
unhashable_nparray = [] successfully_binned = [] for j,i in enumerate(df3.columns): try: print(i) df_temp = pd.DataFrame() df_temp[i] = df3[i] df_temp[target_var] = y bins = sc.woebin(df_temp, y=target_var, positive='bad|1') successfully_binned.append(i) print(i,"---{a}---{b}----{c}--{d}---{z}----Success".format(z =df3[i].nunique() ,a = df3[i].shape, b=df3[i].isna().sum(),c=type(df3[i]),d=df3[i].dtypes)) except TypeError: unhashable_nparray.append(i) print(i,"---{a}---{b}----{c}--{d}---{z}----Fail".format(z =df3[i].nunique(),a = df3[i].shape, b=df3[i].isna().sum(),c=type(df3[i]),d=df3[i].dtypes))
但未发现明显规律,请问该报错的原因可能是什么?
可能的报错原因分析
列中存在numpy数组类型的单元格:尽管列的dtypes显示为float64,但个别单元格可能存储了numpy.ndarray对象(比如之前的数据处理中误将数组赋值给了单元格)。scorecardpy在分箱时需要对变量值进行哈希操作(如分组统计),而numpy数组是不可哈希类型,因此触发报错。可以用以下代码检查报错列:
import numpy as np print(df3[报错列名].apply(lambda x: isinstance(x, np.ndarray)).any())目标变量y的类型问题:如果y是numpy数组而非pandas Series,合并到df_temp时可能引发内部处理异常。尝试将y转为Series后再传入:
df_temp[target_var] = pd.Series(y)极端取值分布触发库内部逻辑异常:某些变量的取值分布极端(比如所有值完全相同、唯一值数量过多/过少,或全部为NaN),可能导致scorecardpy在计算分箱时生成numpy数组作为中间值,进而触发哈希报错。可以检查报错变量的取值分布,比如用
df3[报错列名].value_counts()查看。数据类型的隐性不一致:虽然dtypes显示为float64,但列中可能混合了不同类型的对象(比如字符串转float失败后残留的对象类型值)。可以用以下代码查看列内所有元素的实际类型:
print(df3[报错列名].apply(type).unique())
内容的提问来源于stack exchange,提问作者Mangesh Divate
相关产品推荐
相关产品推荐

