pandas轻尾数据按自定义百分位打标签时qcut分箱报错如何解决?
报错原因
你的数据中存在大量重复的0值,调用pd.qcut分100箱时,多个百分位对应的边界值完全相同,触发了默认的重复边界报错规则。
解决方案
你不需要拆分100个箱,仅需根据你自定义的百分位规则设置分位点即可,以下是两种可行实现方式:
方案1:调整qcut参数适配重复边界
直接指定你需要的分位点,同时设置duplicates='drop'自动删除重复边界:
import pandas as pd # 定义百分位节点和对应标签 quantiles = [0, 0.01, 0.05, 0.15, 0.85, 0.95, 0.99, 1] labels = ['---', '--', '-', 'o', '+', '++', '+++'] # 分箱打标签,duplicates='drop'解决重复边界报错 df['Bucket'] = pd.qcut(df['Score'], q=quantiles, labels=labels, duplicates='drop')
方案2:用百分比排名实现(更稳定,无边界冲突问题)
先计算每个分数的排名百分比,再按规则匹配标签,完全避免分箱边界问题:
import pandas as pd import numpy as np # 计算分数从高到低的百分比排名,值越小排名越靠前 df['rank_pct'] = df['Score'].rank(pct=True, ascending=False) # 定义标签匹配规则 conditions = [ df['rank_pct'] <= 0.01, # 前1% (df['rank_pct'] > 0.01) & (df['rank_pct'] <= 0.05), # 前5%不在前1% (df['rank_pct'] > 0.05) & (df['rank_pct'] <= 0.15), # 前15%不在前5% df['rank_pct'] >= 0.99, # 后1% (df['rank_pct'] >= 0.95) & (df['rank_pct'] < 0.99), # 后5%不在后1% (df['rank_pct'] >= 0.85) & (df['rank_pct'] < 0.95), # 后15%不在后5% ] choices = ['+++', '++', '+', '---', '--', '-'] # 匹配标签,剩余中间值默认标为o df['Bucket'] = np.select(conditions, choices, default='o')
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

