我在python中读了一个大的csv文件。没有关于数据集的描述以及如何编码缺失值。
如果我想将所有缺失的值替换为0,我想我可以使用函数fillna()
。但是,我的问题是:我认为这个函数fillna()
并且可能是其他函数操作缺失值只有在数据框中的符号NaN
是python保留符号时才能识别缺失值?如果NaN
是一个字符串,即"NaN"
,那么函数fillna()
将无法检测到该权限吗?
我做了一个实验
import numpy as np
a = pd.DataFrame({'a':[1,2,'NaN'], 'b':['NaN',1,np.nan]})
a.fillna("")
这里我尝试用空格替换缺失值。但正如您所看到的,此fillna()
函数仅捕获np.nan
但无法将字符串"NaN"
识别为缺失值。这是可以理解的。
以下是我的问题:python中的函数read_csv
或其他导入函数是如何工作的(我的意思是编码)来处理原始数据中的缺失值?当这些导入函数读取csv或txt文件(或其他格式)时,如果它们“看到”原始数据集中的符号,它们是否会自动使用保留符号NaN
来替换该段原始数据?例如,当他们正在阅读原始数据时,如果他们看到空白,或者看到像“\ N”这样的符号,他们会做什么?我想如果他们看到“\ N”,他们只会把这个符号变成一个字符串,对吗?但如果他们看到一片空白,他们会做什么?
第二个问题:在我的数据集中,可以有多个符号来表示缺失值,例如,python保留符号NaN
(在读取原始数据时自动生成)表示缺失值;字符串"\N"
也表示缺失值;空白也表示缺失值。所以我需要编写一个函数来将所有这些不同类型的缺失值符号转换为一个,即python保留符号NaN
。我做了以下
def nullify(x):
if x == "\\N":
return "NaN"
else:
return x
然后我发现我有一堆"NaN"
字符串而不是python保留符号NaN
,这使得像fillna()
这样的函数无法捕获它。我想知道写这个nullify()
的正确方法是
import numpy as np
def nullify(x):
if x == "\\N":
return np.nan
else:
return x
这是我第一次开始玩现实世界的原始数据,许多有趣的事情开始出现。任何建议都表示赞赏。
答案 0 :(得分:4)
pandas.read_csv()
采用关键字参数na_values
。引用documentation:
na_values:标量,str,list-like或dict,默认无其他 字符串识别为NA / NaN。如果dict通过,具体的每列NA 值。默认情况下,以下值被解释为NaN:'', '#N / A','#N / A N / A','#N',' - 1。#IND',' - 1。#QNAN',' - 'N',' - nan', '1.#IND','1。#QNAN','N / A','NA','NULL','NaN','nan'`。
将数据集中的所有类型的NaN添加到na_values
时,在CSV中读取时会将它们全部转换为单一类型的nan
,因此您无需手动转换它们