忽略pandas中不匹配的dtype的行

时间:2016-07-25 07:57:07

标签: python csv pandas

我在pandas中阅读巨大的CSV时指定了dtypes:

pd.read_csv('29_2016/data.csv', 
            error_bad_lines=False, 
            encoding='utf-8', 
            dtype={'a': str, 'b': np.float64, 'c':np.float64}, 
            na_values=['na'], quotechar='"')

但有一些"坏"由于某些数据准备问题,我的数据中的行与dtype不匹配。例如,我可能在列b或列c中有字符串。

使用pandas read_csv阅读CSV时,有没有办法忽略这些不良行?

错误:

pandas/parser.pyx in pandas.parser.TextReader.read (pandas/parser.c:7988)()

pandas/parser.pyx in pandas.parser.TextReader._read_low_memory (pandas/parser.c:8244)()

pandas/parser.pyx in pandas.parser.TextReader._read_rows (pandas/parser.c:9261)()

pandas/parser.pyx in pandas.parser.TextReader._convert_column_data (pandas/parser.c:10654)()

pandas/parser.pyx in pandas.parser.TextReader._convert_tokens (pandas/parser.c:11891)()

ValueError: could not convert string to float: some string "\

1 个答案:

答案 0 :(得分:1)

根据https://github.com/pandas-dev/pandas/issues/2570中的讨论,似乎处理格式错误的数值的预期方式是加载数据而不强制dtypes然后调用pd.to_numeric()(或列上的pd.to_XXXXX()系列的其他功能(根据需要)。 (事实上​​,在上面提到的讨论中,建议convert_objects()已被弃用。

因此,在这里有争议的情况下,我会做以下事情:

data = pd.read_csv('29_2016/data.csv', 
            error_bad_lines=False, 
            encoding='utf-8', 
            na_values=['na'], quotechar='"')

然后

data.b = pd.to_numeric(data.b,errors='coerce')  # 'coerce' results in NaN for entries that can't be converted
data.c = pd.to_numeric(data.c,errors='coerce')

data = data[data.b.notnull() & data.c.notnull()]  # filter out rows with NaN