При звонке
df = pd.read_csv('somefile.csv')
Я получил:
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: столбцы (4,5,7,16) имеют смешанные типы. Укажите опцию dtype при импорте или установите low_memory = False.
Почему этот dtype
вариант связан с этим low_memory
и почему он False
поможет решить эту проблему?
Ответы:
Устаревшая опция low_memory
low_memory
Опция не правильно осуждается, но это должно быть, так как он не делает ничего по- разному [ источник ]Причина, по которой вы получаете это
low_memory
предупреждение, заключается в том, что угадывание dtypes для каждого столбца требует очень много памяти. Pandas пытается определить тип dtype, анализируя данные в каждом столбце.D-тип догадки (очень плохо)
Pandas может определить, какой тип d должен иметь столбец, только после прочтения всего файла. Это означает, что на самом деле ничего не может быть проанализировано до того, как будет прочитан весь файл, если вы не рискуете изменить dtype этого столбца при чтении последнего значения.
Рассмотрим пример одного файла, в котором есть столбец с именем user_id. Он содержит 10 миллионов строк, где user_id - это всегда числа. Поскольку pandas не может знать, что это только числа, он, вероятно, будет сохранять его как исходные строки, пока не прочитает весь файл.
Указание dtypes (всегда должно быть сделано)
добавление
на
pd.read_csv()
вызов заставит панд узнать, когда он начнет читать файл, что это только целые числа.Также стоит отметить, что если бы последняя строка в файле была
"foobar"
записана вuser_id
столбце, загрузка завершилась бы аварийно, если бы был указан вышеупомянутый тип dtype.Пример сломанных данных, которые ломаются, когда определены dtypes
Типы dtypes, как правило, не совсем понятны, подробнее о них можно прочитать здесь: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html.
Какие типы существуют?
У нас есть доступ к numpy dtypes: float, int, bool, timedelta64 [ns] и datetime64 [ns]. Обратите внимание на то, что ntypty dtypes даты / времени не осведомлены о часовом поясе.
Панды расширяет этот набор dtypes своим собственным:
datetime64 [ns,], которая является временной меткой с учетом часового пояса.
'category', которая по сути является enum (строки, представленные целочисленными ключами для сохранения
'period []' Не путать с timedelta, эти объекты фактически привязаны к определенным периодам времени
«Sparse», «Sparse [int]», «Sparse [float]» предназначены для разреженных данных или «данных, в которых много дырок». Вместо сохранения NaN или None в кадре данных он пропускает объекты, экономя место ,
«Интервал» - это отдельная тема, но его основное использование - индексация. Подробнее здесь
«Int8», «Int16», «Int32», «Int64», «UInt8», «UInt16», «UInt32», «UInt64» - это все целые числа для панд, которые могут иметь значение null, в отличие от простого варианта.
'string' - это определенный тип d для работы со строковыми данными, который предоставляет доступ к
.str
атрибуту в серии.'boolean' похож на numy 'bool', но он также поддерживает отсутствующие данные.
Прочитайте полную ссылку здесь:
Панда dtype ссылка
Gotchas, предостережения, заметки
Настройка
dtype=object
отключит упомянутое выше предупреждение, но не сделает его более эффективным с точки зрения памяти, а эффективнее всего процесса.Установка
dtype=unicode
не будет делать ничего, так как для numpy, aunicode
представляется какobject
.Использование конвертеров
@sparrow правильно указывает на использование конвертеров, чтобы избежать взрыва панд при встрече
'foobar'
в столбце, указанном какint
. Я хотел бы добавить, что преобразователи действительно тяжелые и неэффективные для использования в пандах и должны использоваться в качестве крайней меры. Это потому, что процесс read_csv - это отдельный процесс.CSV-файлы могут обрабатываться построчно и, следовательно, могут обрабатываться несколькими конвертерами параллельно более эффективно, просто разрезая файл на сегменты и выполняя несколько процессов, чего не поддерживает pandas. Но это другая история.
источник
dtype=object
не более эффективна для использования памяти, есть ли причина возиться с ней, кроме как избавиться от ошибки?error_bad_lines=False, warn_bad_lines=True
должен сделать свое дело. Документация говорит, что это допустимо только с синтаксическим анализатором C. В нем также говорится, что парсером по умолчанию является None, что затрудняет определение того, какой парсер используется по умолчанию.nrows=100
в качестве аргумента, а затем сделать,df.dtypes
чтобы увидеть dtypes, которые вы получаете. Однако при чтении всего кадра данных с этими dtypes обязательно сделайтеtry/except
так, чтобы вы уловили ошибочные догадки dtype. Вы знаете, что данные грязные.Пытаться:
Согласно документации панд:
Что касается low_memory, то по умолчанию оно True и еще не задокументировано. Я не думаю, что это актуально, хотя. Сообщение об ошибке носит общий характер, так что вам все равно не нужно связываться с low_memory. Надеюсь, что это поможет, и дайте мне знать, если у вас есть дальнейшие проблемы
источник
dtype=unicode
производства:NameError: name 'unicode' is not defined
. Но вставкаunicode
в кавычки (как в 'Unicode'), кажется, работает!numpy.dtype('unicode')
. Когда вы даете опции dtype строку, она будет пытаться привести ее черезnumpy.dtype()
фабрику по умолчанию. Указание на'unicode'
самом деле ничего не даст, юникоды просто преобразуютсяobjects
. Вы получитеdtype='object'
Это должно решить проблему. Я получил точно такую же ошибку при чтении 1,8M строк из CSV.
источник
Как упоминалось ранее firelynx, если dtype явно указан и есть смешанные данные, которые не совместимы с этим dtype, тогда загрузка завершится сбоем. Я использовал конвертер, подобный этому, в качестве обходного пути для изменения значений с несовместимым типом данных, чтобы данные все еще могли быть загружены.
источник
У меня была похожая проблема с файлом ~ 400 МБ. Настройка
low_memory=False
сделала свое дело для меня. Сначала сделайте простые вещи, я бы проверил, что ваш фрейм данных не превышает системную память, перезагрузите компьютер, очистите ОЗУ, прежде чем продолжить. Если вы по-прежнему сталкиваетесь с ошибками, стоит убедиться, что с вашим.csv
файлом все в порядке, взгляните в Excel и убедитесь, что нет явных повреждений. Сломанные исходные данные могут нанести ущерб ...источник
Я столкнулся с аналогичной проблемой при обработке огромного CSV-файла (6 миллионов строк). У меня было три проблемы: 1. файл содержал странные символы (исправлено с помощью кодировки) 2. тип данных не был указан (исправлено с помощью свойства dtype) 3. При использовании вышеупомянутого я все еще сталкивался с проблемой, связанной с file_format, которая не могла быть определяется на основе имени файла (исправлено с помощью try .. кроме ..)
источник
Это
low_memory = False
помогло мне при импорте DataFrame. Вот и все изменения, которые сработали для меня:источник