You need to enable JavaScript to run this app. Pandas基于条件筛选重复行:含缺失Reason的同编号重复组保留方法
优惠活动
大模型
产品
解决方案
定价
更多

Pandas基于条件筛选重复行:含缺失Reason的同编号重复组保留方法

Pandas 高效筛选实现(无需逐组循环)

先修正你现有重复提取代码的缺陷

你当前用df[df['No'].duplicated() == True]提取重复行的逻辑有问题:duplicated()默认会把每个重复组的第一行标记为非重复,只标记后面出现的重复行,最后拿到的子集每个No只剩半行,根本凑不齐整组数据,这也是你之前需要逐组配对找行的原因。
要拿到每个重复No对应的全量行,只要把duplicated()的参数改成 keep=False 即可,逻辑是只要值重复出现,不管第几次出现,全标记为True:

df_duplicates = df[df['No'].duplicated(keep=False)].copy()

统一缺失值判定规则

看示例里你用字符串'-'代表Reason缺失,这种字符串pandas不会自动识别为缺失值,需要先替换成可计算的缺失标记:

df_duplicates['Reason'] = df_duplicates['Reason'].replace('-', pd.NA)

如果你的Reason列原生就是用NaN/NA存储缺失的,这步可以跳过。

向量化分组筛选

你的筛选规则拆解下来其实非常简单:

  • 只要同一个No的组里,存在至少一个Reason是缺失的,不管是全缺失还是部分缺失,整组全部保留
  • 只有组内所有Reason都非缺失的时候,才把整组删掉
    完全不用逐组遍历,用groupby.transform直接生成全行筛选掩码就行,这种 向量化实现 在数据量大的时候性能比循环高几个量级:
# 按No分组,判定每组是否存在Reason缺失,把组级结果广播回原始每一行
keep_flag = df_duplicates.groupby('No')['Reason'].transform(lambda col: col.isna().any())
# 应用掩码得到最终结果
final_df = df_duplicates[keep_flag].reset_index(drop=True)

结果匹配验证

跑出来的输出和你预期的完全一致:

No   Reason  
123  -
123  -
345  Bad Service
345  -

其中No=546的组因为两个Reason都是非缺失值,会被整组排除,完全符合规则要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 19:06:03