熊猫:读取CSV时出现错误错误

时间:2020-03-05 20:30:59

标签: python python-3.x pandas

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或我指定的内容填充失败值时是否失败?

2 个答案:

答案 0 :(得分:1)

这是一个可能对您有用的解决方案;或至少可以引导您前进。

注意事项:

执行AFIK操作将无法实现-即:int64列的值为NaN,因为NaNfloat数据类型。此外,这暗示着无需将列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,因为NaNfloat数据类型。

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