看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
某公司年会设有抽奖环节,奖品设有三个等级:一等奖一名,二等奖两名,三等奖三名。要求一个人只能中一次奖。
重要提示
注:以下代码由于代码陈旧,不建议再学习,可浏览作者用类的方法编写的新代码,详见:用类编写一个年会抽奖程序。
我们先构造数据:
import pandas as pd
# 安装:pip install faker
from faker import Faker
f = Faker('zh-cn')
Faker.seed(4321)
df = pd.DataFrame([f.name() for i in range(50)], columns=['name'])
df.head()
'''
name
0 张鹏
1 吴红
2 张倩
3 徐桂英
4 杨丹丹
'''
增加一列用于存储结果:
df['等级'] = ''
df.tail()
'''
name 等级
45 严璐
46 牛玉英
47 裴春梅
48 张娟
49 周瑜
'''
上面构造了 50 名员工的名单,抽奖时执行以下代码:
# 配置信息,第一位为抽奖人数,第二位为奖项等级
win_info = (3, '三等奖')
# 创建一个筛选器变量
filter_ = df.index.isin(df.sample(win_info[0]).index) & (df.等级=='')
# 执行抽奖,将等级写入
df.loc[filter_, '等级'] = win_info[1]
# 显示本次抽奖结果
df.loc[df.等级==win_info[1]]
'''
name 等级
20 许杰 三等奖
30 高荣 三等奖
49 周瑜 三等奖
'''
筛选器 filter 每次用 sample 匹配出得奖的人,这些得奖的人从无等级的人中产生,接着用 loc 查出这些人,将等级写入,最后再用 loc 将本次抽奖结果筛选显示出来。
抽二等奖:
# 配置信息,第一位为抽奖人数,第二位为奖项等级
win_info = (2, '二等奖')
# 创建一个筛选器变量
filter_ = df.index.isin(df.sample(win_info[0]).index) & (df.等级=='')
# 执行抽奖,将等级写入
df.loc[filter_, '等级'] = win_info[1]
# 显示本次抽奖结果
df.loc[df.等级==win_info[1]]
'''
name 等级
2 张倩 二等奖
21 姚秀梅 二等奖
'''
抽一等奖:
# 配置信息,第一位为抽奖人数,第二位为奖项等级
win_info = (1, '一等奖')
# 创建一个筛选器变量
filter_ = df.index.isin(df.sample(win_info[0]).index) & (df.等级=='')
# 执行抽奖,将等级写入
df.loc[filter_, '等级'] = win_info[1]
# 显示本次抽奖结果
df.loc[df.等级==win_info[1]]
'''
name 等级
24 何桂荣 一等奖
'''
经过几次抽奖,每次可以将得奖结果显示出来,如下所示。
# 显示所有结果
df[~(df.等级=='')].groupby(['等级','name']).max()
'''
等级 name
一等奖 何桂荣
二等奖 姚秀梅
张倩
三等奖 周瑜
许杰
高荣
'''
注:此案例收录在《深入浅出Pandas:利用Python进行数据处理与分析》17.2.6 小节。
(完)
更新时间:2024-08-18 16:55:55 标签:pandas python 抽奖