我有各种csv文件,并将它们作为DataFrame导入。问题在于许多文件使用不同的符号表示缺失值。有些使用nan,其他人使用NaN,ND,None,missing等,或者只是保持条目为空。有没有一种方法可以用np.nan替换所有这些值?换句话说,数据框中的任何非数字值都变成了np.nan。感谢您的帮助。
我发现了一种我认为相对优雅但也很强大的方法:
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'
,但在您明确进行转换之前,它们仍将被视为数据框中的字符串。# 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)
我认为在处理混乱数据时,最佳实践是:
这很容易做到。
Pandas read_csv
有一个值列表,它会查找并自动将其转换为NaN,而解析数据(请参见文档中read_csv
的列表)。您可以使用na_values参数扩展此列表,并使用dtypes参数告诉pandas如何转换特定的列。
在上面的示例中,pctapi
是一个列的名称,由于NaN值,它的类型被强制转换为对象类型而不是float64。所以,我强制pandas转换为float64,并为read_csv函数提供了一个要转换为NaN
的值列表。
由于数据科学通常完全涉及流程,我想描述一下我用于创建na_values列表和调试数据集中的问题的步骤。
在上面的示例中,Pandas大约正确了一半的列。但是,我希望所有列都在“count”字段下方列出为float64类型。我们需要修复这个问题。
# 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})
(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分钟正确地转换你的列将是非常值得的。
read_csv
函数接受一个na_value
参数,你可以传入可能的缺失值列表;否则,你可以在DataFrame上调用to_numeric(errors='coerce')
来处理缺失值。 - EdChumread_csv
;如果它们未知但您知道某些无效,则请使用后处理选项。 - EdChum