pandas
python
抽奖
看过来
《pandas 教程》 持续更新中,可作为 pandas 入门进阶课程、pandas 中文手册、用法大全,配有案例讲解和速查手册。提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。查看更新日志。作者开办 Python 数据分析培训,详情 Python 数据分析培训。
![]() |
本教程作者所著新书《Python之光:Python编程入门与实战》(ISBN:9787111729891)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
![]() |
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
某公司年会设有抽奖环节,奖品设有三个等级:一等奖一名,二等奖两名,三等奖三名。要求一个人只能中一次奖。我们先构造数据:
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.等级.isna())
# 执行抽奖,将等级写入
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.等级.isna())
# 执行抽奖,将等级写入
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.等级.isna())
# 执行抽奖,将等级写入
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 小节。
(完)