如何批量将Pandas DataFrame各列唯一值替换为NaN?
批量替换DataFrame各列唯一值为NaN的高效方法
需求说明
现有如下结构的Pandas DataFrame,其中重复出现的值为有效测量值,仅出现一次的唯一值为无效值,需要将所有数据列中的唯一值批量替换为NaN。
原始DataFrame
ID Sample_1 Sample_2 A 0.182 0.754 B 0.182 0.754 C 0.182 0.01 D 0.182 0.2 E 0.9 0.2
目标DataFrame
ID Sample_1 Sample_2 A 0.182 0.754 B 0.182 0.754 C 0.182 NaN D 0.182 0.2 E NaN 0.2
现有单列处理方案
目前已实现单列处理逻辑,但无法批量适配多列场景:
unique_loc = df.groupby("Sample_1").filter(lambda x: len(x) == 1).index df.loc[unique_loc, "Sample_1"] = np.nan
批量处理方案
以下两种方法可高效实现多列批量处理,无需逐列编写代码:
方法1:使用value_counts + mask
通过apply遍历所有数值列,利用value_counts统计值出现次数,再用mask将次数为1的元素替换为NaN:
import pandas as pd import numpy as np # 构造示例数据(实际使用时可替换为你的DataFrame) data = { "ID": ["A", "B", "C", "D", "E"], "Sample_1": [0.182, 0.182, 0.182, 0.182, 0.9], "Sample_2": [0.754, 0.754, 0.01, 0.2, 0.2] } df = pd.DataFrame(data) # 指定需要处理的数值列(排除非数值列如ID) numeric_cols = df.columns.drop("ID") # 批量替换唯一值为NaN df[numeric_cols] = df[numeric_cols].apply( lambda col: col.mask(col.value_counts()[col] == 1) )
方法2:使用groupby.transform(大数据集更高效)
利用groupby.transform获取每个值的出现次数,通过where保留次数>1的元素,其余设为NaN,该方法为向量化操作,性能更优:
df[numeric_cols] = df[numeric_cols].apply( lambda col: col.where(col.groupby(col).transform("size") > 1) )
内容的提问来源于stack exchange,提问作者Einar
相关产品推荐
相关产品推荐

