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

使用Pandas对指定列去重时如何保留空值行不被删除

解决方案

Pandas的drop_duplicates方法默认会将空值(包括NaN、空字符串"")判定为相同值,所以所有空值行会被视为重复项仅保留第一个,和你的需求冲突。以下两种实现方案均适配百万级数据量,无需手动修改空值:

方案1:布尔索引直接过滤(更简洁)

核心逻辑是仅标记「非空的重复行」为待删除项,所有空值行无论是否重复都会保留:

# 以下代码以对列索引为1的列去重为例,替换为你实际的目标列即可
# 标记非空的重复行
is_duplicated = df.duplicated(subset=[1], keep="first")
is_null = df[1].isna() | (df[1] == "")
# 仅过滤掉非空的重复行
df = df[~(is_duplicated & ~is_null)].reset_index(drop=True)

如果你需要对多列分别去重,对每个目标列重复执行上述逻辑即可,不需要重复执行相同列的去重操作(你当前代码里两次执行subset=[2]的去重是无效的)。

方案2:拆分合并逻辑(可读性更高)

将数据集拆分为空值行、非空行两部分,非空行单独去重后再和空值行合并,恢复原有顺序:

# 以对列索引为1的列去重为例
null_mask = df[1].isna() | (df[1] == "")
# 非空部分去重
df_not_null = df[~null_mask].drop_duplicates(subset=[1])
# 空值部分全部保留
df_null = df[null_mask]
# 合并后按原始索引排序恢复顺序
df = pd.concat([df_not_null, df_null]).sort_index().reset_index(drop=True)

两种方案均为Pandas向量化运算,处理百万级数据耗时极低,完全满足性能要求,执行后即可得到你预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:09:00