如何在熊猫中用NaN替换浮点值?

ral*_*rez 2 python replace nan pandas

我知道熊猫中的替换功能:https : //pandas.pydata.org/pandas-docs/stable/generation/pandas.DataFrame.replace.html

但是我已经完成了这个简单的测试,当我尝试替换浮点值时,它无法按预期工作:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD'))
print(df.head(n=1))

      A         B        C         D
0  1.437202  1.919894 -1.40674 -0.316737

df = df.replace(1.437202, np.nan)
print(df.head(n=1))

      A         B        C         D
0  1.437202  1.919894 -1.40674 -0.316737
Run Code Online (Sandbox Code Playgroud)

如您所见,[[0],[0]]没变……关于这可能是什么的任何想法?

jez*_*ael 5

问题是float精度,所以使用功能numpy.isclosemask

np.random.seed(123)
df = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD'))
print(df.head(n=1))
          A         B         C         D
0 -1.085631  0.997345  0.282978 -1.506295

df = df.mask(np.isclose(df.values, 0.997345))
Run Code Online (Sandbox Code Playgroud)

或使用numpy.where

arr = np.where(np.isclose(df.values, 0.997345), np.nan, df.values)
df = pd.DataFrame(arr, index=df.index, columns=df.columns)
Run Code Online (Sandbox Code Playgroud)
print(df.head(n=1))
          A   B         C         D
0 -1.085631 NaN  0.282978 -1.506295
Run Code Online (Sandbox Code Playgroud)

编辑:您还可以通过select_dtypes按子集过滤只获取数字列[]

np.random.seed(123)
df = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD')).assign(E='a')

cols = df.select_dtypes(np.number).columns
df[cols] = df[cols].mask(np.isclose(df[cols].values, 0.997345))
print(df.head(n=1))
          A   B         C         D  E
0 -1.085631 NaN  0.282978 -1.506295  a
Run Code Online (Sandbox Code Playgroud)