如何在Pandas中按条件删除重复EEID且薪资为NaN的行
解决Pandas中重复EEID保留非NaN薪资行的问题
针对你的需求,核心是让非NaN薪资的行优先被保留——默认的drop_duplicates只会保留每个EEID第一次出现的行,而你的数据里EMP01的NaN行排在前面,所以才会被错误保留。这里提供几种实用解决方案:
方法1:先排序再去重(最简单直接)
先把薪资非NaN的行排到前面,再执行去重操作,这样第一个出现的就是你要保留的有效行:
# 按薪资列排序,将NaN行放到最后 sorted_data = data.sort_values(by="薪资", na_position="last") # 按EEID去重,保留第一个出现的行(即非NaN薪资行) cleaned_data = sorted_data.drop_duplicates(subset=["EEID"], keep="first")
方法2:用GroupBy筛选有效行
如果需要更精准的控制,可以按EEID分组,直接筛选出每组内薪资非NaN的行:
# 对每个EEID组,只保留薪资非空的行;若组内有多个有效行,取第一个 cleaned_data = data.groupby("EEID").apply( lambda group: group[group["薪资"].notna()].head(1) ).reset_index(drop=True)
方法3:标记有效组后筛选
先标记出存在有效薪资的EEID组,再过滤掉该组内的NaN行,最后去重:
# 标记每个EEID组是否存在非NaN薪资 has_valid_salary = data.groupby("EEID")["薪资"].transform(lambda x: x.notna().any()) # 先筛选出有有效薪资的组的所有行,再去重保留第一个有效行 filtered_data = data[has_valid_salary] cleaned_data = filtered_data.drop_duplicates(subset=["EEID"], keep="first")
原方法失效原因
drop_duplicates(subset=["EEID"])默认保留每组EEID第一次出现的行,你的数据里EMP01的NaN行在第0位,所以被保留,而后面的有效行被删除。上面的方法要么调整行顺序让有效行优先,要么直接筛选出目标行,确保最终保留的是你需要的记录。
内容的提问来源于stack exchange,提问作者vasu
相关产品推荐
相关产品推荐

