Pandas read_csv Параметры low_memory и dtype

При звонке

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 помощью с этой проблемой?

  • Подавлять вывод в Python-вызовах для исполняемых файлов
  • Можно ли создавать ярлыки при наведении курсора на точку в matplotlib?
  • Эквивалент команды вставки R для вектора чисел в Python
  • Какие символы Unicode принимаются в именах переменных Python3?
  • Пример .travis для Django с MySQL-тестами.
  • Морской груз load_dataset
  • wxPython: как определить источник события
  • я не знаю __iter__ в python, кто может дать мне хороший пример кода
  • 4 Solutions collect form web for “Pandas read_csv Параметры low_memory и dtype”

    Устаревшая опция low_memory

    Параметр low_memory не является устаревшим, но он должен быть, поскольку он фактически не делает ничего по-другому [ source ]

    Причина, по которой вы получаете это предупреждение low_memory заключается в том, что угадывание dtypes для каждого столбца очень требует памяти. Pandas пытается определить, какой dtype задавать, анализируя данные в каждом столбце.

    Dtype Guessing (очень плохо)

    Pandas может определять только, какой dtype столбец должен иметь после чтения всего файла. Это означает, что ничего не может быть проанализировано до того, как весь файл будет прочитан, если вы не рискуете изменить dtype этого столбца при чтении последнего значения.

    Рассмотрим пример одного файла с столбцом user_id. Он содержит 10 миллионов строк, где user_id всегда является числом. Поскольку панды не могут знать, что это только числа, это, вероятно, сохранит их как исходные строки, пока не прочитает весь файл.

    Указание типов (всегда должно быть сделано)

    добавление

     dtype={'user_id': int} 

    к pd.read_csv() заставит pandas знать, когда он начнет читать файл, что это только целые числа.

    Также стоит отметить, что если последняя строка в файле будет иметь "foobar" написанную в столбце user_id , загрузка будет аварийна, если указан указанный выше тип dtype.

    Пример разбитых данных, которые ломаются при определении типов данных

     import pandas as pd from StringIO import StringIO csvdata = """user_id,username 1,Alice 3,Bob foobar,Caesar""" sio = StringIO(csvdata) pd.read_csv(sio, dtype={"user_id": int, "username": object}) ValueError: invalid literal for long() with base 10: 'foobar' 

    dtypes, как правило, многозначительны, подробнее о них читайте здесь: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

    Gotchas, оговорки, примечания

    Установка dtype=object заставит замолчать вышеупомянутое предупреждение, но не сделает его более эффективным с точки зрения памяти, а только эффективно работает.

    Установка dtype=unicode ничего не сделает, поскольку в numpy unicode представляется как object .

    Использование преобразователей

    @sparrow правильно указывает на использование преобразователей, чтобы избежать взрыва панд при столкновении с 'foobar' в столбце, указанном как int . Я хотел бы добавить, что преобразователи действительно тяжелы и неэффективны для использования в пандах и должны использоваться в качестве последнего средства. Это связано с тем, что процесс read_csv представляет собой один процесс.

    Файлы CSV могут обрабатываться по очереди и, следовательно, могут быть обработаны несколькими преобразователями параллельно более эффективно, просто разбивая файл на сегменты и запуская несколько процессов, что не поддерживает панды. Но это совсем другая история.

    Пытаться:

     dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode') 

    Согласно документации pandas:

    dtype: имя типа или dict столбца -> тип

    Что касается low_memory, он по умолчанию True и еще не задокументирован. Я не думаю, что это имеет значение. Сообщение об ошибке является общим, поэтому вам все равно не нужно возиться с low_memory. Надеюсь, что это поможет и сообщит мне, если у вас возникнут дополнительные проблемы

     df = pd.read_csv('somefile.csv', low_memory=False) 

    Это должно решить проблему. Я получил точно такую ​​же ошибку при чтении строк 1.8M из CSV.

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

     def conv(val): if not val: return 0 try: return np.float64(val) except: return np.float64(0) df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv}) 
    Python - лучший язык программирования в мире.