Pandas如何删除同时满足col1重复且col2为null的行
错误原因
你的代码逻辑和需求不匹配,存在三处问题:
- 条件写反:删除条件要求
col2为null,你写的df['col2'].notna()是匹配col2非空的行 - 重复判定规则不对:
duplicated()默认keep='first',只会标记重复值中除第一次出现外的后续行,无法覆盖所有col1值存在重复的记录 - 筛选逻辑偏差:直接取
m1 & m2会误删col2为空但col1无重复的有效行(比如测试数据里index=2的A2行)
正确代码
核心思路是先定位同时满足两个删除条件的行,再取反保留其余所有行:
import pandas as pd import numpy as np d = {'col1': ['A1', 'B4', 'A2', 'A1', 'B4', 'B4'], 'col2': [np.nan, 'ref4', np.nan, 'ref3', 'ref1', 'ref3']} df = pd.DataFrame(data=d) # 定位需要删除的行:col1存在重复值 & col2为空 to_drop = df['col1'].duplicated(keep=False) & df['col2'].isna() # 保留不需要删除的行 df = df[~to_drop] print(df)
运行输出完全符合预期:
col1 col2 1 B4 ref4 2 A2 NaN 3 A1 ref3 4 B4 ref1 5 B4 ref3
参数说明:
duplicated(keep=False)会把所有对应值出现次数≥2的行都标记为重复,如果你实际需求是只删除重复项中非首次出现、且col2为空的行,去掉keep=False用默认参数即可,可根据业务场景调整。
内容的提问来源于stack exchange,提问作者Diop Chopra
相关产品推荐
相关产品推荐

