Устаревшая опция low_memory
low_memory
Опция не правильно осуждается, но это должно быть, так как он не делает ничего по- разному [ источник ]
Причина, по которой вы получаете это low_memory
предупреждение, заключается в том, что угадывание dtypes для каждого столбца требует очень много памяти. Pandas пытается определить тип dtype, анализируя данные в каждом столбце.
D-тип догадки (очень плохо)
Pandas может определить, какой тип d должен иметь столбец, только после прочтения всего файла. Это означает, что на самом деле ничего не может быть проанализировано до того, как будет прочитан весь файл, если вы не рискуете изменить dtype этого столбца при чтении последнего значения.
Рассмотрим пример одного файла, в котором есть столбец с именем user_id. Он содержит 10 миллионов строк, где user_id - это всегда числа. Поскольку pandas не может знать, что это только числа, он, вероятно, будет сохранять его как исходные строки, пока не прочитает весь файл.
Указание dtypes (всегда должно быть сделано)
добавление
dtype={'user_id': int}
на pd.read_csv()
вызов заставит панд узнать, когда он начнет читать файл, что это только целые числа.
Также стоит отметить, что если бы последняя строка в файле была "foobar"
записана в user_id
столбце, загрузка завершилась бы аварийно, если бы был указан вышеупомянутый тип dtype.
Пример сломанных данных, которые ломаются, когда определены dtypes
import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})
ValueError: invalid literal for long() with base 10: 'foobar'
Типы 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, a unicode
представляется как object
.
Использование конвертеров
@sparrow правильно указывает на использование конвертеров, чтобы избежать взрыва панд при встрече 'foobar'
в столбце, указанном как int
. Я хотел бы добавить, что преобразователи действительно тяжелые и неэффективные для использования в пандах и должны использоваться в качестве крайней меры. Это потому, что процесс read_csv - это отдельный процесс.
CSV-файлы могут обрабатываться построчно и, следовательно, могут обрабатываться несколькими конвертерами параллельно более эффективно, просто разрезая файл на сегменты и выполняя несколько процессов, чего не поддерживает pandas. Но это другая история.