使用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
相关产品推荐
相关产品推荐

