如何用Pandas合并员工花名册与训练数据并生成指定透视表?
合并员工花名册与训练状态报表并透视训练数据
作为刚接触Python和Pandas的新手,我最近完成了一个报表合并的任务,在这里分享我的实现过程和解决方案,希望能帮到有类似需求的小伙伴,也欢迎各位大佬提出优化建议!
背景与示例数据
我有两份报表需要处理:
- 训练状态报表:包含15列,通过
Training Code列的逻辑生成Training列,同一员工完成多项训练时会重复出现(比如示例里的Name2) - 员工主花名册:包含9列,基于
Status列生成Required列,是唯一的员工列表
训练状态报表示例代码与输出
import pandas as pd df = pd.DataFrame({ 'Name':['Name1','Name2','Name2','Name3'], 'Office':['A', 'B', 'B', 'A'], 'Position':['Director','Manager','Manager','Analyst'], 'Training Code':['C3','C1-L','C2','C1-B'], 'Training':['ADV','BEG','INT','BEG'] })
输出结果:
Name Office Position Training Code Training 0 Name1 A Director C3 ADV 1 Name2 B Manager C1-L BEG 2 Name2 B Manager C2 INT 3 Name3 A Analyst C1-B BEG
员工主花名册示例代码与输出
df4 = pd.DataFrame({ 'Name':['Name1','Name2','Name3','Name4'], 'Office':['A', 'B', 'A', 'C'], 'Position':['Director','Manager','Analyst','Supervisor'], 'Symbol':['OS','BP','OD','EO'], 'Status':[1,3,8,2], 'Required':['Required','Required','Recommended','Required'] })
输出结果:
Name Office Position Symbol Status Required 0 Name1 A Director OS 1 Required 1 Name2 B Manager BP 3 Required 2 Name3 A Analyst OD 8 Recommended 3 Name4 C Supervisor EO 2 Required
需求目标
需要将两份报表合并为指定格式:以员工主花名册为基础,合并透视后的训练数据——也就是把Training列拆分为多列,并统计每个员工对应训练的完成次数。
实现过程与解决方案
我一开始尝试先透视训练数据再和主花名册合并,但不确定这种方式是不是最优解。后来我尝试先合并两个表再进行透视,结果遇到了生成空DataFrame的问题,最后把透视时的aggfunc从count改成len就解决了这个问题。
完整的实现代码如下:
# 左连接主花名册和训练数据的Name、Training列 result = pd.merge(df4, df[['Name','Training']], on='Name', how='left') # 将空的Training值填充为'NONE' result.update(result[['Training']].fillna('NONE')) # 指定透视的索引列 cols = ['Name','Office','Position','Symbol','Status','Required'] # 透视表:按指定列分组,Training列作为列,统计次数并填充空值为0 pvt2 = result.pivot_table(index=cols, columns=['Training'], fill_value=0, aggfunc=len)
这样就能得到以主花名册为基础,每个员工对应不同训练完成次数的透视结果啦!
内容的提问来源于stack exchange,提问作者MonkeyMonkey
相关产品推荐
相关产品推荐

