如何在pandas数据帧中用NaN替换所有非数字条目?

时间:2017-01-30 14:39:33

标签: python pandas

我有各种csv文件,我将它们导入为DataFrame。问题是许多文件使用不同的符号来表示缺失值。有些人使用nan,其他人使用NaN,ND,无,丢失等等,或只是将条目空白。有没有办法用np.nan替换所有这些值?换句话说,数据框中的任何非数字值都将变为np.nan。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

我发现我认为这是一种相对优雅但又强大的方法:

def isnumber(x):
    try:
        float(x)
        return True
    except:
        return False

df[df.applymap(isnumber)]

如果不清楚:只有当您拥有的任何输入都可以转换为浮点数时,才定义一个返回True的函数。然后,您使用该布尔数据帧过滤df,该数据帧会自动将NaN分配给您未过滤的单元格。

我尝试的另一个解决方案是将isnumber定义为

import number
def isnumber(x):
    return isinstance(x, number.Number)

但是我对这种方法不太喜欢的是你可能会意外地将数字作为一个字符串,所以你会错误地过滤掉那些。这也是一个偷偷摸摸的错误,看到数据框显示的字符串"99"与数字99相同。

修改

在您的情况下,您可能仍然需要df = df.applymap(float)过滤后,因为float适用于'nan'的所有不同大写,但在您明确转换它们之前,它们仍将是在数据框中考虑了字符串。

答案 1 :(得分:2)

替换读取时的非数字条目,更简单(更安全)

TL; DR:为无法正确转换的列设置数据类型,并提供na_values列表

# Create a custom list of values I want to cast to NaN, and explicitly 
#   define the data types of columns:
na_values = ['None', '(S)', 'S']
last_names = pd.read_csv('names_2010_census.csv', dtype={'pctapi': np.float64}, na_values=na_values)

详细说明

我认为处理混乱数据的最佳做法是:

  • 为数据类型不正确推断的列提供数据类型给熊猫。
  • 明确定义应转换为NaN的值的列表。

这很容易做到。

Pandas read_csv包含一个要查找的值列表,并在解析数据时自动将其强制转换为NaN(有关列表,请参见read_csv的{​​{3}})。您可以使用na_values参数扩展此列表,还可以告诉熊猫如何使用dtypes参数强制转换特定列。

在上面的示例中,pctapi是由于NaN值而强制转换为对象类型而不是float64的列的名称。因此,我强迫熊猫将其强制转换为float64,并为read_csv函数提供要强制转换为NaN的值列表。

我要遵循的过程

由于数据科学通常完全与过程有关,所以我认为我描述了创建na_values列表并使用数据集调试此问题的步骤。

步骤1:尝试导入数据,并让熊猫推断出数据类型。检查数据类型是否符合预期。如果它们是=继续前进。

documentation

在上面的示例中,Pandas就在大约一半的列上。但是,我希望“计数”字段下面列出的所有列都是float64类型。我们需要解决此问题。

步骤2:如果数据类型与预期的不同,请使用dtypes参数在读取时显式设置数据类型。默认情况下,这将对无法转换的值引发错误。

# note: the dtypes dictionary specifying types. pandas will attempt to infer
#   the type of any column name that's not listed
last_names = pd.read_csv('names_2010_census.csv', dtype={'pctwhite': np.float64})

这是运行上面的代码时收到的错误消息: enter image description here

步骤3:创建熊猫无法转换的值的显式列表,并将其在读取时转换为NaN。

从错误消息中,我可以看到熊猫无法转换(S)的值。我将此添加到我的na_values列表中:

# note the new na_values argument provided to read_csv
last_names = pd.read_csv('names_2010_census.csv', dtype={'pctwhite': np.float64}, na_values=['(S)'])

最后,重复步骤2和3,直到获得完整的dtype映射和na_values列表。

如果您正在从事业余项目,则此方法可能超出了您的需要,您可能想使用u / instant的答案。但是,如果您是在生产系统中或团队中工作,那么花10分钟正确铸造您的柱子就很值得。