我在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 "\
答案 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