Pandas如何将mean_v列排名分为0-2三类生成rank_0-2新列
解决方案
你可以根据实际分类逻辑选择以下两种实现方式:
方案1:基于dense排名截断(排名最高的为0,次高为1,其余所有为2)
在你原有代码的基础上调整即可,先把排名起始值从1转为0,再截断最大值为2:
# 原有dense排名逻辑不变,减1把起始值从1调整为0,再用clip限制最大值为2 df['rank_0-2'] = df.mean_v.rank(method='dense', ascending=False).astype(int) - 1 df['rank_0-2'] = df['rank_0-2'].clip(upper=2)
对应你的示例数据运行结果如下:
| mean_v | rank_0-2 |
|---|---|
| 0 | 2 |
| 0.00787 | 2 |
| 1.00787 | 0 |
| 0.222222222222222 | 2 |
| 0.277777777777777 | 2 |
| 0.363636363636363 | 2 |
| 0.00787 | 2 |
| 1.00787 | 0 |
| 0.222222222222222 | 2 |
| 0.4 | 1 |
方案2:按分位数三等分(数值前1/3为0,中间1/3为1,后1/3为2)
如果需要把所有数据按数值大小平均分为三类,使用分箱方法实现:
# qcut按分位数拆为3组,降序排列下数值越大分类值越小 df['rank_0-2'] = pd.qcut(df['mean_v'], q=3, labels=[2,1,0]).astype(int)
内容的提问来源于stack exchange,提问作者AmberBahia
相关产品推荐
相关产品推荐

