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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:50:21