Проблема в точности с плавающей точкой, поэтому используйте функцию numpy.isclose
с mask
:
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))
Или используйте 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)
print(df.head(n=1))
A B C D
0 -1.085631 NaN 0.282978 -1.506295
РЕДАКТИРОВАТЬ: Вы также можете получить только числовые столбцы по 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