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

如何基于多条件筛选DataFrame中重复员工的最高教育记录?

处理重复员工编码的DataFrame筛选问题

我有一个包含重复员工编码(Emp_code)的DataFrame,需要为每个员工编码仅保留一条符合优先级规则的记录。

原始数据

Emp_code|Education Level|StartEducation|EndEducation
001 |Diploma      |Jun-1995|Jun 1999
001 |Professional |May-2002|May 2006
002 |PostGraduate | -      | -
002 |Diploma&Cert | -      | -
003 |PostGraduate |Jun-2008| -
003 |Diploma      |Aug-2005| -
004 |Graduate/Equi|-       | Mar-2012
004 |Professional |-       | Aug-2014

期望输出

Emp_code|Education Level|StartEducation|EndEducation
001 |Professional |May-2002|May-2006
002 |PostGraduate |-       |-
003 |PostGraduate |Jun-2008|-
004 |Professional |-       |Aug-2014

筛选规则

  • 优先选择EndEducation日期最大的记录;
  • 若EndEducation为'-',则选择StartEducation日期最大的记录;
  • 若StartEducation也为'-',则按Education Level的优先级选择。

教育等级优先级(从高到低)

  • Professional
  • PostGraduate
  • Diploma&Cert
  • Diploma
  • Graduate/Equi

解决方案

通过数据转换+自定义排序+分组取首的方式可一次性实现所有规则,具体步骤如下:

1. 处理日期列

先将表示空值的'-'转换为NaT(缺失日期类型),同时把日期字符串转为可比较的日期格式:

import pandas as pd

# 假设已加载原始数据为df1
# df1 = pd.read_csv(..., sep='|', skipinitialspace=True)

# 替换'-'并转换日期列
df1['EndEducation'] = pd.to_datetime(df1['EndEducation'].str.strip(), errors='coerce')
df1['StartEducation'] = pd.to_datetime(df1['StartEducation'].str.strip(), errors='coerce')

2. 映射教育等级权重

给每个教育等级分配权重值,优先级越高权重越大:

edu_priority = {
    'Professional': 5,
    'PostGraduate': 4,
    'Diploma&Cert': 3,
    'Diploma': 2,
    'Graduate/Equi': 1
}
df1['edu_weight'] = df1['Education Level'].map(edu_priority)

3. 按规则排序并分组取首

按照筛选规则的优先级排序,之后按员工编码分组取每组第一条记录:

# 排序规则:员工编码升序,EndEducation降序,StartEducation降序,教育权重降序
sorted_df = df1.sort_values(
    by=['Emp_code', 'EndEducation', 'StartEducation', 'edu_weight'],
    ascending=[True, False, False, False],
    na_position='last'
)

# 分组取每组第一条,重置索引
result_df = sorted_df.groupby('Emp_code', as_index=False).first()

# 可选:将日期列转回原格式,NaT替换为'-'
result_df['EndEducation'] = result_df['EndEducation'].dt.strftime('%b-%Y').fillna('-')
result_df['StartEducation'] = result_df['StartEducation'].dt.strftime('%b-%Y').fillna('-')

# 删除临时权重列
result_df = result_df.drop('edu_weight', axis=1)

运行后result_df即为符合要求的结果。

内容的提问来源于stack exchange,提问作者Sasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:15:37