Pandas: утверждать столбец в файле как строку [duplicate]

Я не буду напрямую отвечать на этот вопрос, как это уже делали другие, но я действительно задаюсь вопросом, стоит ли вставлять все зависимости в jar самого проекта.

Я вижу точку (простота развертывания / использования), но это зависит от варианта использования вашего проекта (и могут быть альтернативы (см. ниже)).

Если вы используете его полностью автономно, почему бы и нет.

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

Хорошая альтернатива:

  • развертывать ваше приложение как .zip / .war: архив содержит банку вашего проекта и все зависимые баночки;
  • используют механизм динамического класса (см. Spring, или вы можете легко сделать это самостоятельно), чтобы иметь единственную точку входа вашего проекта (один класс для запуска - см. механизм манифеста на другом ответ), который добавит (динамически) к текущему пути к классу все остальные необходимые банки.

Как и в случае с манифестом и «специальным динамическим классом загрузчика», вы может начать свой проект с:

java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
146
задан firelynx 15 April 2016 в 06:38
поделиться

5 ответов

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

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

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

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

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

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

Задание типов dtypes (всегда должно быть сделано)

/ g15]

dtype={'user_id': int}

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

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

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

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

Какие существуют типы dtypes?

Это numpy dtypes, которые также принимаются в pandas

[numpy.generic,
 [[numpy.number,
   [[numpy.integer,
     [[numpy.signedinteger,
       [numpy.int8,
        numpy.int16,
        numpy.int32,
        numpy.int64,
        numpy.int64,
        numpy.timedelta64]],
      [numpy.unsignedinteger,
       [numpy.uint8,
        numpy.uint16,
        numpy.uint32,
        numpy.uint64,
        numpy.uint64]]]],
    [numpy.inexact,
     [[numpy.floating,
       [numpy.float16, numpy.float32, numpy.float64, numpy.float128]],
      [numpy.complexfloating,
       [numpy.complex64, numpy.complex128, numpy.complex256]]]]]],
  [numpy.flexible,
   [[numpy.character, [numpy.bytes_, numpy.str_]],
    [numpy.void, [numpy.record]]]],
  numpy.bool_,
  numpy.datetime64,
  numpy.object_]]

Pandas также добавляет два типа dtypes: categorical и datetime64[ns, tz], которые недоступны в numpy

Ссылка на pandas dtype

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

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

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

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

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

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

209
ответ дан firelynx 27 August 2018 в 08:39
поделиться

У меня была аналогичная проблема с файлом ~ 400 МБ. Установка low_memory = False сделала трюк для меня. Сначала делайте простые вещи, я бы проверял, что ваш фреймворк не больше вашей системной памяти, перезагрузитесь, очистите оперативную память перед продолжением. Если вы все еще сталкиваетесь с ошибками, стоит убедиться, что ваш CSV-файл в порядке, быстро просмотрите Excel и убедитесь, что нет очевидной коррупции. Сломанные исходные данные могут привести к хаосу ...

0
ответ дан Dr Nigel 27 August 2018 в 08:39
поделиться
df = pd.read_csv('somefile.csv', low_memory=False)

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

15
ответ дан firelynx 27 August 2018 в 08:39
поделиться

Как упоминалось ранее 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})
7
ответ дан sparrow 27 August 2018 в 08:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: