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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:59:54