当pandas中对每一列进行apply操作,如果输出变量设置有问题,会报错ValueError:not enough values to unpack/ too many values to unpack
def mono_bin_replace_woe(Y,X,n=20): # 最优分箱
r = 0
good = Y.sum()
bad = Y.count() - good
while np.abs(r) < 0.4:
d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": pd.qcut(X, n,duplicates='drop')})
d2 = d1.groupby('Bucket', as_index=True)
r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)
n = n - 1
print("n,r,p",n,r,p)
d3 = pd.DataFrame(d2.X.min(), columns=['min'])
d3['min'] = d2.min().X
d3['max'] = d2.max().X
d3['sum'] = d2.sum().Y
d3['total'] = d2.count().Y
d3['rate'] = d2.mean().Y
d3['woe'] = np.log((d3['rate']/(1-d3['rate']))/(good/bad))
d3['goodattribute'] = d3['sum']/good
d3['badattribute'] = (d3['total']-d3['sum'])/bad
iv = ((d3['goodattribute'] - d3['badattribute']) * d3['woe']).sum()
d4 = d3.sort_values(by='min').reset_index()
return d4, iv, cut, woe
d4, iv, cut, woe=df2.iloc[:,1:3].apply(lambda x:mono_bin(df2['label2'], x, n=20),axis=0)
如运行上述代码会报错:not enough values to unpack,此时应改为:
df3=df2.iloc[:,1:3].apply(lambda x:mono_bin(df2['label2'], x, n=20),axis=0)
解释:
对每一列进行apply操作后,生成的数据结构是以列为维度的Series,即返回的四个变量会成为某列对应的数据,故生成值应赋给1个变量而不是4个