如何将含混合数据的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
相关产品推荐
相关产品推荐

