Python Pandas ошибка токенизации данных
Я пытаюсь использовать панды для манипулирования .CSV-файл, но я получаю эту ошибку:
панды.синтаксический анализатор.CParserError: ошибка маркирования данных. C ошибка: ожидается 2 поля в строке 3, увидел 12
Я попытался прочитать документы панды, но ничего не нашел.
мой код очень простой:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Как я могу решить это? Я должен использовать csv модуль или другой язык ?
файл из Морнингстар
19 ответов:
это может быть проблема с
- разделители в
- первая строка, как отметил @TomAugspurger
чтобы решить эту проблему, попробуйте указать
sepи/илиheaderаргументов при вызовеread_csv. Например,df = pandas.read_csv(fileName, sep='delimiter', header=None)в коде выше,
sepопределяет ваш разделитель иheader=Noneговорит панд, что ваши исходные данные не имеют строки для заголовков / заголовков столбцов. Так говорит документы: "если файл не содержит строки заголовка, то вы должны явно передать header=None". В этом случае pandas автоматически создает целочисленные индексы для каждого поля {0,1,2,...}.согласно документам, разделитель вещь должна не быть проблемой. В документах говорится, что " если sep нет [не указано], попытается автоматически определить это."Мне, однако, не повезло с этим, включая случаи с очевидными разделителями.
синтаксический анализатор запутывается в заголовке файла. Он читает первую строку и выводит количество столбцов из этой строки. Но первые две строки не являются репрезентативными для фактических данных в файле.
попробуйте
data = pd.read_csv(path, skiprows=2)
CSV-файл может иметь переменное количество столбцов и
read_csvвыведено количество столбцов из первых нескольких строк. Два способа решить ее в этом случае:1) измените файл CSV на фиктивную первую строку с максимальным количеством столбцов (и укажите
header=[0])2) или использовать
names = list(range(0,N))где N-максимальное количество столбцов.
у меня тоже была эта проблема, но, возможно, по другой причине. У меня были некоторые конечные запятые в моем CSV, которые добавляли дополнительный столбец, который панды пытались прочитать. Используя следующие работы, но он просто игнорирует плохие строки:
data = pd.read_csv('file1.csv', error_bad_lines=False)Если вы хотите сохранить линии уродливый вид рубить для обработки ошибок, чтобы сделать что-то вроде следующего:
line = [] expected = [] saw = [] cont = True while cont == True: try: data = pd.read_csv('file1.csv',skiprows=line) cont = False except Exception as e: errortype = e.message.split('.')[0].strip() if errortype == 'Error tokenizing data': cerror = e.message.split(':')[1].strip().replace(',','') nums = [n for n in cerror.split(' ') if str.isdigit(n)] expected.append(int(nums[0])) saw.append(int(nums[2])) line.append(int(nums[1])-1) else: cerror = 'Unknown' print 'Unknown Error - 222' if line != []: # Handle the errors however you wantя приступил к написанию сценария для повторной вставки строк в фрейм данных, так как плохие строки будут заданы переменной 'line' в приведенном выше коде. Этого можно избежать, просто используя читатель csv. Будем надеяться, что разработчики панды могут сделать его легче справиться с этой ситуацией в будущем.
это, безусловно, вопрос разделителя, так как большинство csv CSV получают создать с помощью
sep='/t'так попробуйread_csvиспользуя символ табуляции(\t)С помощью разделителя/t. Итак, попробуйте открыть с помощью следующей строки кода.data=pd.read_csv("File_path", sep='\t')
У меня была эта проблема несколько раз. Почти каждый раз, причина в том, что файл, который я пытался открыть, не был правильно сохранен CSV для начала. И под "правильно" я имею в виду, что каждая строка имела одинаковое количество разделителей или столбцов.
обычно это происходило потому, что я открыл CSV в Excel, а затем неправильно сохранил его. Несмотря на то, что расширение файла все еще было .csv, чистый формат CSV был изменен.
любой файл, сохраненный с pandas to_csv будет правильно отформатирован и не должен иметь этой проблемы. Но если вы откроете его с другой программой, это может изменить структуру.
надеюсь, что это поможет.
я столкнулся с той же проблемой. Используя
pd.read_table()на том же исходном файле, казалось, работали. Я не мог проследить причину этого, но это было полезным обходным путем для моего случая. Возможно, кто-то более знающий может пролить свет на то, почему это сработало.изменить: Я обнаружил, что эта ошибка ползет вверх, когда у вас есть какой-то текст в файле, который не имеет того же формата, что и фактические данные. Обычно это информация верхнего или нижнего колонтитула (больше одной строки, поэтому skip_header не работает) который не будет разделен тем же количеством запятых, что и ваши фактические данные (при использовании read_csv). Использование read_table использует вкладку в качестве разделителя, который может обойти текущую ошибку пользователей, но ввести другие.
обычно я обхожу это, читая дополнительные данные в файл, а затем использую метод read_csv ().
точное решение может отличаться в зависимости от вашего фактического файла, но этот подход работал для меня в нескольких случаях
у меня была аналогичная проблема при попытке прочитать таблицу с разделителями табуляции с пробелами, запятыми и кавычками:
1115794 4218 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "" 1144102 3180 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", "" 368444 2328 "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", "" import pandas as pd # Same error for read_table counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c') pandas.io.common.CParserError: Error tokenizing data. C error: out of memoryЭто говорит, что это имеет какое-то отношение к C parsing engine (который является стандартным). Может быть, переход на python один изменит что-нибудь
counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python') Segmentation fault (core dumped)теперь это другая ошибка.
Если мы продолжим и попытаемся удалить пробелы из таблицы, ошибка из python-engine снова изменится:1115794 4218 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","" 1144102 3180 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus","" 368444 2328 "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides","" _csv.Error: ' ' expected after '"'и это становится ясно что у панд были проблемы с разбором наших строк. Чтобы разобрать таблицу с движком python, мне нужно было удалить все пробелы и кавычки из таблицы заранее. Тем временем C-engine продолжал рушиться даже с запятыми в строках.
Чтобы избежать создания нового файла с заменами я сделал это, так как мои таблицы малы:from io import StringIO with open(path_counts) as f: input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('','')) counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')tl; dr
Измените механизм синтаксического анализа, старайтесь избегать любых не разделяющих кавычек / запятых / пробелов в ваших данных.
хотя это не относится к этому вопросу, эта ошибка также может появиться со сжатыми данными. Явно устанавливая значение для
kwargcompressionрешена моя проблема.result = pandas.read_csv(data_source, compression='gzip')
Иногда проблема заключается не в том, как использовать python, а с необработанными данными.
Я получил это сообщение об ошибкеError tokenizing data. C error: Expected 18 fields in line 72, saw 19.оказалось, что в описании столбца иногда встречаются запятые. Это означает, что CSV-файл необходимо очистить или использовать другой разделитель.
использовать
pandas.read_csv('CSVFILENAME',header=None,sep=', ')при попытке прочитать данные csv из ссылки
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Я скопировал данные с сайта в свой csvfile. У него были дополнительные пробелы, поэтому он использовал sep =', ' и он работал :)
альтернатива, которую я нашел полезной при работе с подобными ошибками синтаксического анализа, использует модуль CSV для перенаправления данных в pandas df. Например:
import csv import pandas as pd path = 'C:/FileLocation/' file = 'filename.csv' f = open(path+file,'rt') reader = csv.reader(f) #once contents are available, I then put them in a list csv_list = [] for l in reader: csv_list.append(l) f.close() #now pandas has no problem getting into a df df = pd.DataFrame(csv_list)Я считаю, что модуль CSV немного более надежен для плохо отформатированных файлов, разделенных запятыми, и поэтому имел успех с этим маршрутом для решения таких проблем.
У меня был набор данных с предварительными номерами строк, я использовал index_col:
pd.read_csv('train.csv', index_col=0)
следующая последовательность команд работает (я теряю первую строку данных-нет заголовка=нет настоящего -, но по крайней мере он загружается):
df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']следующее не работает:
df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))CParserError: ошибка маркирования данных. C ошибка: ожидается 53 поля в строке 1605634, увидел 54 Следующее не работает:
df = pd.read_csv(filename, header=None)CParserError: ошибка маркирования данных. C ошибка: ожидается 53 поля в строке 1605634, saw 54
следовательно, в вашей проблеме вы должны пройти
usecols=range(0, 2)
У меня была аналогичная ошибка, и проблема заключалась в том, что у меня были некоторые экранированные кавычки в моем csv-файле и нужно было установить параметр escapechar соответствующим образом.
Вы можете сделать этот шаг, чтобы избежать проблемы -
train = pd.read_csv('/home/Project/output.csv' , header=None)просто добавить -
header=Noneнадеюсь, что это помогает!!
Я получил a .csv от коллеги и когда я попытался прочитать csv с помощью pd.read_csv (), я получил аналогичную ошибку. По-видимому, он пытался использовать первую строку для создания столбцов для фрейма данных, но было много строк, которые содержали больше столбцов, чем предполагала первая строка. Я закончил тем, что исправил эту проблему, просто открыв и повторно сохранив файл как .csv и использование pd.read_csv() еще раз.
Comments