pandas.to_datetime
函数具有一个errors
关键字参数,如果将其设置为'coerce',它将用NaT
替换所有无法转换的值。
在投射列时,是否可以在pandas.read_csv
中复制该功能?
例如,如果我在CSV文件中包含以下数据:
a,c
0,a
1,b
2,c
a,d
我尝试:
pd.read_csv("file.csv", dtype={"a":"int64", "c":'object'})
抛出错误,表明它无法将列a
转换为类型int64
。
有没有一种方法可以读取带有熊猫的CSV文件,以便在转换列以NaN
或我指定的内容填充失败值时是否失败?
答案 0 :(得分:1)
这是一个可能对您有用的解决方案;或至少可以引导您前进。
执行AFIK操作将无法实现-即:int64
列的值为NaN
,因为NaN
是float
数据类型。此外,这暗示着无需将列c
转换为object
。
首先,在不转换数据类型的情况下读取CSV。然后,清理数据/转换数据类型。
import numpy as np
import pandas as pd
# Just pretend this is reading from a CSV.
data = {'a': [0, 1, 2, 'a'],
'c': ['a', 'b', 'c', 'd']}
df = pd.DataFrame(data)
原始数据集:
a c
0 0 a
1 1 b
2 2 c
3 a d
a object
c object
dtype: object
转换列a
:
使用pd.to_numeric
函数,可以通过将任何错误强制到to_datetime
来执行与NaN
类似的操作。但是,这会将您的列转换为float64
,因为NaN
是float
数据类型。
df['a'] = pd.to_numeric(df['a'], errors='coerce')
输出:
a c
0 0.0 a
1 1.0 b
2 2.0 c
3 NaN d
a float64
c object
dtype: object
将列a
转换为int64
:
如果必须将列a
作为整数,则可以执行以下操作:
df['a'] = df['a'].replace(np.nan, 0).astype(np.int64)
输出:
a c
0 0 a
1 1 b
2 2 c
3 0 d
a int64
c object
dtype: object
希望这可以帮助您入门。
答案 1 :(得分:0)
这是在读取时执行此操作的另一种解决方案。您可以将手动转换功能作为 pd.read_csv(..., converters=...)
传递给 csv 读取。
对于您的情况,您应该通过 converters={'a': convert_to_none_coerce_if_not}
其中 convert_to_none_coerce_if_not
可以是:
import numpy as np
def convert_to_none_coerce_if_not(val: str):
try:
if int(str) == float(str):
# string is int
return np.int16(str)
else:
# string is numeric, but a float
return np.nan
except ValueError as e:
# string cannot be parsed as a number, return nan
return np.nan