使用pd.qcut计算RFM分位数出现分箱边重复、标签不匹配错误如何解决
报错原因解析
边界重复报错触发原因
你的RFM指标对应列存在大量重复值,以报错给出的边界数组[ 1., 1., 1., 1., 37.]为例,说明对应列75%以上的数值都是1,pd.qcut()默认按分位数生成4等份对应5个边界时,前4个边界值完全相同,不符合分箱逻辑,因此触发报错。
标签数量不匹配报错触发原因
添加duplicates='drop'参数后,pandas会自动删除重复的边界值,上面的例子里5个重复边界删除后仅剩[1., 37.]2个边界,2个边界只能对应1个分箱,仅需要1个标签,但你传入了4个标签['1','2','3','4'],标签数量比实际需要的多,因此触发该报错。
解决方案
你可以根据自己的业务需求选择以下任意一种方案:
- 方案1:先确认数据分布,再调整分箱逻辑
先执行代码查看各列唯一值数量:
如果某列唯一值数量小于4,说明该列本身无法被分为4个分位数箱,可降低分箱数,或者改用print(rfm[['recency','frequency','sum_non_compliance']].nunique())pd.cut()做等宽分箱。 - 方案2:动态生成匹配数量的标签
先计算实际分箱数量,再生成对应长度的标签,示例代码如下:# 以recency列为例,其他列按相同逻辑修改即可 # 先获取去重后的分箱边界 test_cut = pd.qcut(rfm['recency'], 4, duplicates='drop') # 生成和分箱数量一致的标签 labels = [str(i+1) for i in range(len(test_cut.cat.categories))] # 正式生成分箱列 rfm['r_quartile'] = pd.qcut(rfm['recency'], 4, labels=labels, duplicates='drop') - 方案3:强制分为4个箱(保留4档RFM评分)
如果业务要求必须保留4档评分,可以先对原始值做排名处理,避免重复值影响分箱,示例代码如下:# 用rank方法的first规则给相同值分配不同排名,消除重复值,再做分箱 rfm['r_quartile'] = pd.qcut(rfm['recency'].rank(method='first'), 4, ['1','2','3','4']) rfm['f_quartile'] = pd.qcut(rfm['frequency'].rank(method='first'), 4, ['1','2','3','4']) rfm['m_quartile'] = pd.qcut(rfm['sum_non_compliance'].rank(method='first'), 4, ['1','2','3','4'])
内容的提问来源于stack exchange,提问作者adey27
相关产品推荐
相关产品推荐

