如何实现等行数十分位拆分并获取区间?解决重复值干扰
解决方案
可以通过先给概率添加唯一排名,再按排名分箱,最后分组统计概率区间的方式,同时实现等行分箱和获取对应概率范围,具体步骤如下:
1. 示例数据准备(可替换为你的真实数据)
import pandas as pd import numpy as np # 生成带重复概率的测试数据(模拟predict_proba的输出) np.random.seed(42) prob_data = np.concatenate([np.repeat(0.5, 20), np.random.uniform(0.1, 0.9, 80)]) test_df = pd.DataFrame({"VALIDATION_PROB_1": prob_data})
2. 实现等行分箱并获取概率区间
# 给概率列添加唯一排名(避免重复值导致qcut分箱不均) test_df['unique_rank'] = test_df['VALIDATION_PROB_1'].rank(method='first') # 按排名做10等分箱,同时获取分箱边界(retbins=True) test_df['TOP_DECILE'], _ = pd.qcut( test_df['unique_rank'], q=10, retbins=True, labels=[10, 20, 30, 40, 50, 60, 70, 80, 90, 100] ) # 分组统计每个分箱对应的概率最小值和最大值,生成区间 decile_prob_ranges = test_df.groupby('TOP_DECILE')['VALIDATION_PROB_1'].agg( min_prob='min', max_prob='max' ).reset_index() # 格式化概率区间列 decile_prob_ranges['PROB_RANGE'] = decile_prob_ranges.apply( lambda row: f"[{row['min_prob']:.4f}, {row['max_prob']:.4f}]", axis=1 )
3. 查看结果
- 查看分箱的统计结果(包含分箱标签和对应概率区间):
print(decile_prob_ranges)
- 如果需要把区间合并到原DataFrame,可使用
merge:
test_df = test_df.merge(decile_prob_ranges[['TOP_DECILE', 'PROB_RANGE']], on='TOP_DECILE', how='left')
说明
- 用
rank(method='first')给重复概率生成唯一排名,确保pd.qcut能将数据严格分成10个行数相等的分箱; - 通过
groupby统计每个分箱的概率极值,即可得到对应分箱的概率范围,完全满足需求。
内容的提问来源于stack exchange,提问作者Jyoti Hassanandani
相关产品推荐
相关产品推荐

