pandas.qcut剩余值处理问题及生成100分位数箱需求
解决pd.qcut分箱丢失箱子的问题
问题根源
你用pd.qcut划分100个分位数箱时,因为分位数计算出现重复分界点,导致相邻箱子被合并。比如1-101的整数序列,部分百分位对应的数值相同,qcut会自动合并这些箱子,最终出现空箱。
替代方案:用百分位排名映射箱号
直接通过计算每个数据的百分位排名,再映射到1-100的箱号,能保证不管数据量是100条还是百万级,都能生成恰好100个箱,且每个箱都有数据(当数据量≥100时)。
修改后的代码:
import pandas as pd game_num = range(1, 102, 1) player_name = ['Fred'] * 101 df = pd.DataFrame({'name': player_name, 'game_num': game_num}) # 计算百分位排名(0到1之间),再映射为1-100的箱号 df['percentile_bin'] = (df['game_num'].rank(pct=True) * 100).astype(int) # 修正边界值:确保最小排名对应1号箱 df['percentile_bin'] = df['percentile_bin'].replace(0, 1)
验证结果
执行df.percentile_bin.nunique()会返回100,每个箱都有数据:
- 1号箱包含
game_num=1 - 2到99号箱各对应1条连续数值
- 100号箱包含
game_num=101(因rank(pct=True)最大值为1,乘以100后为100)
通用适配
对于任意≥100条的单个个体数据,这个方法都能稳定生成100个分位数箱:
- 数据量刚好100条时,每个箱恰好1条数据
- 数据量超过100条时,每个箱的数据量均匀分布(最多相差1条)
内容的提问来源于stack exchange,提问作者TunaFishLies
相关产品推荐
相关产品推荐

