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

如何将含混合数据的Pandas DataFrame中的数值替换为NaN?

解决DataFrame中数值替换为NaN的问题

我懂你遇到的困扰了:你的DataFrame里混杂着NaN、有特定含义的字符串,还有数值类型的数据,想要把所有数值单元格替换成NaN,但之前用正则的方法完全没效果——这是因为df.replace搭配regex=True只会处理字符串类型的单元格,那些本身就是int/float的数值根本不会被正则匹配到,自然不会有任何变化。

下面给你两种可行的解决方案:

方法1:用applymap逐个检查单元格类型

这种方法逻辑直观,自定义函数判断每个单元格是否是数值(同时排除NaN,因为NaN属于float类型),符合条件就替换成NaN:

import numpy as np
import pandas as pd

# 你的原始DataFrame
df = pd.DataFrame([['abc', 'cdf', 1], ['k', 'sum', 'some'], [1000, np.nan, 'nothing']])

def replace_numeric(val):
    # 判断是否是int/float类型,且不是NaN
    if isinstance(val, (int, float)) and not pd.isna(val):
        return np.nan
    return val

# 应用到整个DataFrame
df_processed = df.applymap(replace_numeric)
print(df_processed)

运行后输出:

0     1       2
0  abc  cdf     NaN
1    k   sum    some
2  NaN   NaN  nothing

方法2:用mask结合pd.to_numeric批量处理

这种方法更简洁,利用pd.to_numeric的errors='coerce'参数,先把能转成数值的单元格保留、不能转的变成NaN,再通过mask把这些能转成数值的位置替换为NaN:

import numpy as np
import pandas as pd

df = pd.DataFrame([['abc', 'cdf', 1], ['k', 'sum', 'some'], [1000, np.nan, 'nothing']])

# 生成布尔掩码:能转成数值的单元格标记为True
numeric_mask = df.apply(pd.to_numeric, errors='coerce').notna()
# 用mask把掩码为True的位置替换成NaN
df_processed = df.mask(numeric_mask)
print(df_processed)

这个方法的输出和方法1完全一致,而且不需要写自定义函数,代码更紧凑。

为什么之前的正则方法无效?

再明确一下原因:df.replace(regex=True)仅对字符串类型的单元格生效。比如如果你的DataFrame里有一个字符串形式的数字(比如'123'),正则'\d+'会匹配到它并替换成NaN,但像示例中1、1000这种本身就是int类型的数值,正则根本不会处理它们,所以之前的方案完全起不到作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:59:31