如何在使用 Pandas 从 CSV 中读取整数时优雅地回退到 NaN 值?

How to gracefully fallback to `NaN` value while reading integers from a CSV with Pandas?

在将 read_csv 与 Pandas 一起使用时,如果我想将给定的列转换为类型,格式错误的值将中断整个操作,而不会指示有问题的值。

例如,运行 类似于:

import pandas as pd
import numpy as np


df = pd.read_csv('my.csv', dtype={ 'my_column': np.int64 })

将导致堆栈跟踪以错误结尾:

ValueError: cannot safely convert passed user dtype of <i8 for object dtyped data in column ...

如果我有错误消息中的行号或违规值,我可以将其添加到已知 NaN 值列表中,但这样我就无能为力了。

有没有办法告诉解析器忽略失败,在这种情况下 return 一个 np.nan

Post Scriptum:有趣的是,在没有任何类型建议(没有 dtype 参数)的情况下进行解析后,d['my_column'].value_counts() 似乎推断出 dtype 正确并把 np.nan 自动正确,即使该系列的实际 dtype 是通用的 object,几乎所有绘图和统计操作都会失败

感谢评论,我意识到 there is no NaN for integers,这让我非常惊讶。因此我转而转换为浮点数:

import pandas as pd
import numpy as np


df = pd.read_csv('my.csv', dtype={ 'my_column': np.float64 })

这给了我一个可以理解的错误消息,其中包含转换失败的值,因此我可以将失败的值添加到 na_values:

df = pd.read_csv('my.csv', dtype={ 'my_column': np.float64 }, na_values=['n/a'])

通过这种方式,我最终可以使用可视化和统计功能导入 CSV:

>>>> df['session_planned_os'].dtype
dtype('float64')

一旦您能够找到正确的 na_values,您就可以从 read_csv 中删除 dtype 参数。类型推断现在将正确发生:

df = pd.read_csv('my.csv', na_values=['n/a'])