如何删除Dataframe中label1、label2、label3值相同的行?
问题分析与解决方法
原代码的核心问题是无法处理三个标签全为NaN的行——因为在Python中,NaN == NaN会返回False,这类行不会被原代码的条件匹配到,导致删不掉。
下面给出两种可行的替代方案:
方案1:用nunique()统一判断
直接通过每行三个标签的唯一值数量来识别是否需要删除:
# 保留三个标签不全相同的行 df = df[~df[['label1', 'label2', 'label3']].apply(lambda x: x.nunique(dropna=False) == 1, axis=1)]
- 原理:
nunique(dropna=False)会把NaN算作一个独立值,当三个标签完全相同时(不管是全0、全1还是全NaN),唯一值数量都是1; ~符号用来取反,筛选出不满足“三个标签全相同”的行。
方案2:拆分条件覆盖全NaN场景
把“全NaN”和“非NaN值全相同”两种情况分开判断,再合并条件:
# 定义需要删除的行的条件 delete_condition = (df[['label1', 'label2', 'label3']].isna().all(axis=1)) | \ ((df['label1'] == df['label2']) & (df['label1'] == df['label3'])) # 删除符合条件的行 df = df[~delete_condition]
- 第一个条件
isna().all(axis=1)专门识别三个标签全为NaN的行; - 第二个条件就是你原来的逻辑,处理非NaN值全相同的情况;
- 用
|(逻辑或)把两个条件合并,再取反保留需要的行。
内容的提问来源于stack exchange,提问作者Gerasimos
相关产品推荐
相关产品推荐

