如何使用Pandas合并员工数据行:忽略重复字段并按FTE排序整合部门及对应FTE信息
如何使用Pandas合并员工数据行:忽略重复字段并按FTE排序整合部门及对应FTE信息
看起来你已经搞定了重复数据的初步清理,现在咱们来一步步实现你想要的合并效果——既要把最高FTE的部门作为主部门,又要在Description里按FTE降序列出所有带对应FTE值的部门,还得保留其他关键字段的正确信息。
先明确咱们的核心目标:
- 同一员工的多行数据合并为一行
- 主
Department取FTE最高的那条记录的部门 Description按FTE从高到低排列,格式为部门名(FTE值 FTE)- 其他字段(
Type、Title、Starting等)取对应最高FTE记录的值 - 避免部门重复出现在Description中
完整实现方案
1. 准备数据(模拟你清理后的数据集)
import pandas as pd # 模拟你已经去重后的员工数据 data = [ [1420, 20241122, 1234, 'Tom', 'Jones', 'CONP', 'TEACHER', 'School 2', 20240826, 99999999, 0.5330], [1420, 20241122, 1234, 'Tom', 'Jones', 'TEPT', 'TEACHER', 'School 3', 20240826, 20250630, 0.1000], [5540, 20241202, 1234, 'Tom', 'Jones', 'TEPT', 'TEACHER', 'School 1', 20240826, 20250630, 0.1801] ] df = pd.DataFrame( data, columns=['EmployeeEntryID', 'ChangeDate', 'Employee#', 'Firstname', 'Lastname', 'Type', 'Title', 'Department', 'Starting', 'Ending', 'FTE'] )
2. 排序与分组聚合
首先对数据按「员工号+FTE降序」排序,这样每个员工组的第一条记录就是FTE最高的那条,方便后续提取主字段值;然后自定义聚合函数处理Description字段:
# 自定义函数:生成带FTE的排序部门描述(自动去重) def build_description(group): # 先按部门去重,保留FTE最高的那条记录 unique_depts = group.drop_duplicates(subset='Department', keep='first') # 按FTE从高到低排序 sorted_depts = unique_depts.sort_values('FTE', ascending=False) # 拼接成指定格式 return ', '.join([f"{row['Department']}({row['FTE']} FTE)" for _, row in sorted_depts.iterrows()]) # 第一步:全局排序,确保每个员工组内FTE高的记录排在前面 df_sorted = df.sort_values(['Employee#', 'FTE'], ascending=[True, False]).reset_index(drop=True) # 第二步:分组聚合,生成最终结果 merged_df = df_sorted.groupby('Employee#', as_index=False).agg( Firstname=('Firstname', 'first'), Lastname=('Lastname', 'first'), Type=('Type', 'first'), # 取最高FTE记录的合同类型 Title=('Title', 'first'), Department=('Department', 'first'), # 主部门取FTE最高的部门 Starting=('Starting', 'first'), # 取最高FTE记录的起始日期 Ending=('Ending', 'first'), # 取最高FTE记录的结束日期 FTE=('FTE', 'first'), # 取最高FTE值 Description=lambda x: build_description(df_sorted[df_sorted['Employee#'] == x.name]) )
3. 查看最终结果
执行print(merged_df)后,你会得到完全符合需求的输出:
| Employee# | Firstname | Lastname | Type | Title | Department | Starting | Ending | FTE | Description |
|---|---|---|---|---|---|---|---|---|---|
| 1234 | Tom | Jones | CONP | TEACHER | School 2 | 20240826 | 99999999 | 0.5330 | School 2(0.5330 FTE), School 1(0.1801 FTE), School 3(0.1000 FTE) |
关键逻辑说明
- 全局排序:先按员工号分组、再按FTE降序排序,确保每个员工的最高FTE记录排在组内第一位,这样聚合时取
first就能拿到对应字段的正确值 - 部门去重:用
drop_duplicates(subset='Department', keep='first')避免同一个部门重复出现在Description中,同时保留该部门对应的最高FTE值 - Description拼接:通过列表推导式把部门和FTE组合成你想要的格式,再用逗号连接成字符串
备注:内容来源于stack exchange,提问作者Andrew Penner
相关产品推荐
相关产品推荐

