在读取时替换非数字条目,更简单(更安全)的方式
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)
更长的解释
我认为处理杂乱数据时的最佳做法是:
- 为未正确推断数据类型的列向 pandas 提供数据类型。
- 明确定义应转换为 NaN 的值列表。
这很容易做到。
Pandas read_csv 有一个值列表,它会在解析数据时查找并自动转换为 NaN(有关列表,请参见 read_csv 的 documentation)。您可以使用 na_values 参数扩展此列表,并且可以告诉 pandas 如何使用 dtypes 参数转换特定列。
在上面的示例中,pctapi 是由于 NaN 值而被强制转换为对象类型而不是 float64 的列的名称。因此,我强制 pandas 转换为 float64 并为 read_csv 函数提供要转换为 NaN 的值列表。
我遵循的过程
由于数据科学通常完全是关于过程的,我想我描述了我用来创建 na_values 列表并使用数据集调试此问题的步骤。
第一步:尝试导入数据,让 pandas 推断数据类型。检查数据类型是否符合预期。如果他们是 = 继续前进。
在上面的示例中,Pandas 在大约一半的列上是正确的。但是,我希望“count”字段下方列出的所有列都是 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})
这是我在运行上述代码时收到的错误消息:
第 3 步:创建一个 pandas 无法转换的值的显式列表,并在读取时将它们转换为 NaN。
从错误消息中,我可以看到 pandas 无法转换 (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 分钟来正确投射列是非常值得的。