You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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#FirstnameLastnameTypeTitleDepartmentStartingEndingFTEDescription
1234TomJonesCONPTEACHERSchool 220240826999999990.5330School 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:03:00