2017-02-13 23 views
1

Я получил файл CSV, где , является разделителем, используемым для разделения полей, но, к сожалению, дополнительным в качестве символа, обозначающего десятичную точку (немецкую нотацию).pandas read malformed CSV

В результате некоторые строки будут иметь различное количество столбцов. Странно преуспеть будет разбирать/читать файл довольно хорошо. Можно ли читать такие файлы и в пандах? До сих пор я только получил что-то похожее на

Error tokenizing data. C error: Expected 97 fields in line 3, saw 98 

редактировать

Вот минимальный пример:

pd.read_csv(os.path.expanduser('~/Downloads/foo.csv'), sep=',', decimal=',') 

с ~/Downloads/foo.csv файл с содержанием

first, number, third 
some, 1, other 
foo, 1.5, bar 
baz, 1,5, some 

Когда я загружаю данные в R

See spec(...) for full column specifications. 
Warnung: 1538 parsing failures. 
row col expected  actual 
    1 -- 93 columns 97 columns 
    2 -- 93 columns 98 columns 
    3 -- 93 columns 97 columns 
    4 -- 93 columns 102 columns 
    5 -- 93 columns 99 columns 

Есть ли такой разрешающий режим в пандах?

+3

Можете ли вы разместить воспроизводимый образец данных? – MaxU

+0

сделано. см. редактирование. –

+0

Является ли это точным представлением данных в том, что есть только один потенциально затронутый столбец за строку? – DSM

ответ

2

Убедитесь, что в вашем файле нет разделителя цитат, который вы должны объявить read_csv.

Если файл плохо сформирован, математически нет детерминированного алгоритма, чем можно решить, если одна последовательность символов с запятой - это два поля или только один с номером, разделенным запятой.

Вам нужно будет написать препроцессор, который выполняет очистку не сформированных данных с помощью ad-hoc-алгоритма, приближающегося к реальности вашего файла. Это может быть неприятно, как Я принимаю цифры предположения, за которыми следует запятая, а затем 3 цифры - это то же поле и любые другие варианты этих исправлений.

Вы также можете столкнуться с случаями, когда даже это не будет детерминированным, тогда вам некуда идти, чтобы перейти к источнику данных и попросить другой формат файла для исправления данных.

Чтобы удалить неправильные строки и загружать другие из них, эти параметры из документации поможет:

error_bad_lines: логическое значение, по умолчанию True линии с слишком много полей (например, CSV линии слишком много запятых) по умолчанию вызовет исключение , и DataFrame не будет возвращен. Если False, , то эти «плохие строки» будут сброшены из DataFrame, который возвращается . (Действует только с C парсер)

warn_bad_lines: Boolean, по умолчанию Правда Если error_bad_lines ложно, и warn_bad_lines истинна, предупреждение для каждого «плохой линии» будет выводиться. (Действителен только с C парсер).

+0

, к сожалению, это звучит как ответ. –

+1

@GeorgHeiler верят моему скромному опыту в этом поле, не только это звучит так, но ваш ум не будет принимать какое-то время, нет альтернативы :-). Если вы подумаете об этом больше, вы увидите, что решение этого в целом согласуется с нарушением проблемы остановки. – Boud

+0

Могу ли я попросить дополнительно найти (см. Мое последнее редактирование) аналогичный разрешающий режим для R, который будет только бросать предупреждения, но все же загружать части данных? –