如何基于多条件筛选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
相关产品推荐
相关产品推荐

