我有各种csv文件,我将它们导入为DataFrame。问题是许多文件使用不同的符号来表示缺失值。有些人使用nan,其他人使用NaN,ND,无,丢失等等,或只是将条目空白。有没有办法用np.nan替换所有这些值?换句话说,数据框中的任何非数字值都将变为np.nan。谢谢你的帮助。
答案 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)
# 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
的{{3}})。您可以使用na_values参数扩展此列表,还可以告诉熊猫如何使用dtypes参数强制转换特定列。
在上面的示例中,pctapi
是由于NaN值而强制转换为对象类型而不是float64的列的名称。因此,我强迫熊猫将其强制转换为float64,并为read_csv函数提供要强制转换为NaN
的值列表。
由于数据科学通常完全与过程有关,所以我认为我描述了创建na_values列表并使用数据集调试此问题的步骤。
在上面的示例中,Pandas就在大约一半的列上。但是,我希望“计数”字段下面列出的所有列都是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分钟正确铸造您的柱子就很值得。