看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例我们将实现,先按成绩进行排序,根据比赛得分前1%获得一等奖,前2%获得二等奖,前3%获得三等奖。
先用 faker 库构造数据:
import pandas as pd
from faker import Faker
f = Faker('zh')
df = pd.DataFrame({'name': [f.name() for i in range(400)],
'score': [f.pyint(1, 10000) for i in range(400)],
})
df.head()
'''
name score
0 贺玉英 5744
1 张建平 3373
2 李旭 8084
3 蒋伟 3053
4 刘杨 3972
'''
两列分别是姓名和得分,由于数据是随机生成,你的执行结果可能和上边不一样。
先增加一个辅助列,对分数列用 rank() 给定占比位置,其中乘以 100 转为 0-100 来表示:
(
df.assign(rk=df.score.rank(ascending=False, pct=True)*100)
.sort_values('rk')
)
'''
name score rk
110 陈雪 9990 0.25
200 陈淑珍 9968 0.50
393 赵刚 9933 0.75
236 洪桂芳 9932 1.00
7 冯玉英 9921 1.25
.. ... ... ...
158 蔡志强 261 99.00
392 舒玉华 223 99.25
92 刘洋 152 99.50
35 杜淑华 128 99.75
208 王宇 103 100.00
[400 rows x 3 columns]
'''
然后根据 rk 百分比数用 pd.cut() 进行分箱,并将标签值设置奖项名称。
(
df.assign(rk=df.score.rank(ascending=False, pct=True)*100)
.sort_values('rk')
.assign(res=lambda x: pd.cut(x.rk, bins=[0, 1, 2, 3],
labels=['一等奖', '二等奖', '三等奖'])
)
.style
)
'''
name score rk res
110 陈雪 9990 0.25 一等奖
200 陈淑珍 9968 0.50 一等奖
393 赵刚 9933 0.75 一等奖
236 洪桂芳 9932 1.00 一等奖
7 冯玉英 9921 1.25 二等奖
120 廖玉 9887 1.50 二等奖
305 王玉英 9881 1.75 二等奖
20 王东 9814 2.00 二等奖
56 朱建国 9806 2.25 三等奖
316 董敏 9752 2.50 三等奖
138 何杨 9714 2.75 三等奖
152 巫佳 9696 3.00 三等奖
143 谢淑英 9694 3.25 NaN
261 梁雪梅 9689 3.50 NaN
288 胡磊 9666 3.75 NaN
36 马峰 9640 4.00 NaN
147 王洁 9636 4.25 NaN
170 吕莹 9612 4.50 NaN
278 陈霞 9533 4.75 NaN
183 梁平 9498 5.00 NaN
...
'''
这样就完成了需求。
(完)
更新时间:2024-08-18 16:21:50 标签:pandas python 分布