python - 如何在熊猫中用 NaN 替换浮点值?
问题描述
我知道熊猫中的替换功能:https ://pandas.pydata.org/pandas-docs/stable/generated/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
如您所见, [[0],[0]] 没有变化……知道这可能是由于什么原因吗?
解决方案
问题是浮点精度,所以使用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
推荐阅读
- reactjs - 将数据从一页传输到另一页
- reactjs - 初始设置 useState 时获取元素的高度
- java - JavaFX .JAR 文件不会从终端在 ubuntu 20.04 上运行
- node.js - 在同一端口上运行 express server 和 socket.io
- allure - 无需在系统 Allure 命令行工具中安装即可生成魅力报告
- php - 如何在 sh 文件 30 分钟后停止 PHP cron 作业
- android - Google Books API 返回意外的缩略图 URL
- ruby - rspec 在程序退出时退出
- python - 如何用 pandas 读取合并的单元格(xls,xlsx)?
- c# - HashSet:推断正确的 EqualityComparer
。默认?