2016-07-25 1 views
1

Я с указанием dtypes при чтении огромного CSV в pandas:пренебрегая строки с DTYPE в удалении информации панд

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.

Есть ли способ игнорировать эти плохие строки при чтении CSV, используя pandasread_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

насчет чтения всего файла и выбрать нужные строки, используя подход, как это (должно быть принято для строк вместо столбцов): http://stackoverflow.com/questions/21271581/selecting-pandas-columns-by-dtype – albert

+0

Что происходит, учитывая предоставленный код, в котором вы определяете типы данных, когда pandas встречает * плохую строку * (которую он не может отнести к указанному dtype)? –

+1

Я думаю, что вы можете использовать аргумент «преобразователи», как в этом [ответе] (http://stackoverflow.com/a/38378291/5717589) (с помощью try-except), затем при необходимости удалите nan. – ptrj

ответ

0

На основе обсуждения в 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