检查符号 NaN 是否为字符串或 python 缺失值保留符号

Check whether symbol NaN is a string or a python reserved symbol for missing value

我在 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" 识别为缺失值。这是可以理解的。

这是我的问题:函数 read_csv 或 python 中的其他导入函数究竟如何工作(我的意思是编码)来处理原始数据中的缺失值?当这些导入函数读取csv或txt文件(或其他格式)时,如果它们"see"原始数据集中的什么符号,它们会自动使用保留符号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

这是我第一次开始玩弄真实世界的原始数据,许多有趣的事情开始出现。任何建议表示赞赏。

pandas.read_csv() 采用关键字参数 na_values。引用 documentation:

na_values : scalar, str, list-like, or dict, default None Additional strings to recognize as NA/NaN. If dict passed, specific per-column NA values. By default the following values are interpreted as NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.

在读取 CSV 时将数据集中所有类型的 NaN 添加到 na_values 会将它们全部转换为单一类型的 nan,因此您无需手动求助转换它们。