如何在使用 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'])
在将 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'])