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

dan*_*nza 6 python csv data-processing pandas

在使用read_csvPandas时,如果我希望将给定列转换为类型,则格式错误的值将中断整个操作,而不会显示有问题的值.

例如,运行类似于:

import pandas as pd
import numpy as np


df = pd.read_csv('my.csv', dtype={ 'my_column': np.int64 })
Run Code Online (Sandbox Code Playgroud)

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

ValueError: cannot safely convert passed user dtype of <i8 for object dtyped data in column ...
Run Code Online (Sandbox Code Playgroud)

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

有没有办法告诉解析器忽略失败并np.nan在这种情况下返回?

Post Scriptum:有趣的是,在解析后没有任何类型的建议(没有dtype参数),d['my_column'].value_counts()似乎推断出dtype正确并np.nan自动正确放置,即使dtype系列的实际是一般的object,几乎每个绘图和统计操作都会失败

dan*_*nza 8

感谢评论,我意识到整数没有NaN,这对我来说非常令人惊讶.因此我切换到转换为浮动:

import pandas as pd
import numpy as np


df = pd.read_csv('my.csv', dtype={ 'my_column': np.float64 })
Run Code Online (Sandbox Code Playgroud)

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

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

这样我最终可以用可视化和统计功能的方式导入CSV:

>>>> df['session_planned_os'].dtype
dtype('float64')
Run Code Online (Sandbox Code Playgroud)

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

df = pd.read_csv('my.csv', na_values=['n/a'])
Run Code Online (Sandbox Code Playgroud)