You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:10:12