Pandas创建分位数列报错:Index不支持可变操作及问题排查
问题分析与解决
错误原因
报错的核心是误用了DataFrame的columns属性:
all_merged_pre_matrix.columns返回的是Pandas的Index对象,这类对象是不可变的,不支持直接通过索引赋值修改。- 你成功运行的代码是直接给DataFrame添加/修改列(
all_merged_pre_matrix['Decile3'] = ...),这才是操作DataFrame列的正确方式。
修正后的代码
把报错代码中的columns去掉,改成和成功代码一致的写法即可:
all_merged_pre_matrix['Decile4'] = pd.qcut(all_merged_pre_matrix['min_score'], 5, labels=False)
后续生成好坏样本的分位数交叉表
假设你的数据中有标识好坏样本的列(比如is_bad,用1代表坏样本、0代表好样本),可以用pd.crosstab生成5×5的交叉表:
1. 坏样本数量交叉表
# 按min_score分位数(Decile4)和app_score分位数(Decile3)统计坏样本数量 cross_tab_bad = pd.crosstab( index=all_merged_pre_matrix['Decile4'], columns=all_merged_pre_matrix['Decile3'], values=all_merged_pre_matrix[all_merged_pre_matrix['is_bad'] == 1]['is_bad'], aggfunc='count', margins=False # 不需要合计行/列时设为False )
2. 好样本数量交叉表
cross_tab_good = pd.crosstab( index=all_merged_pre_matrix['Decile4'], columns=all_merged_pre_matrix['Decile3'], values=all_merged_pre_matrix[all_merged_pre_matrix['is_bad'] == 0]['is_bad'], aggfunc='count', margins=False )
如果需要查看分位数组合的好坏样本占比,可调整代码计算占比:
# 按行归一化,查看每行分位数组合的坏样本占比 cross_tab_bad_pct = pd.crosstab( index=all_merged_pre_matrix['Decile4'], columns=all_merged_pre_matrix['Decile3'], values=all_merged_pre_matrix['is_bad'], aggfunc='mean', margins=False )
内容的提问来源于stack exchange,提问作者Matthew Freeman
相关产品推荐
相关产品推荐

