Застарений варіант low_memory
low_memoryОпція не правильно засуджується, але це повинно бути, так як він не робить нічого по- різному [ джерело ]
Причина, за якою ви це отримуєте low_memory попередження, полягає в тому, що відгадування типів для кожного стовпця дуже вимогливе до пам'яті. Pandas намагається визначити, який dtype встановити, аналізуючи дані в кожному стовпчику.
Гадання типу (дуже погано)
Панди можуть лише визначити, який тип файлу повинен мати типовий стовпчик після того, як буде прочитаний весь файл. Це означає, що нічого не можна реально розібрати перед тим, як прочитати весь файл, якщо ви не ризикуєте змінити тип цього стовпця під час читання останнього значення.
Розглянемо приклад одного файлу, який містить стовпець під назвою user_id. Він містить 10 мільйонів рядків, де user_id - це завжди цифри. Оскільки панди не можуть знати, що це лише числа, вони, ймовірно, зберігатимуть його як оригінальні рядки, поки не прочитають весь файл.
Визначення типів (завжди слід робити)
додавання
dtype={'user_id': int}
до pd.read_csv() виклику повідомляє панди, коли він почне читання файлу, що це лише цілі числа.
Також варто відзначити, що якби останній рядок у файлі був би "foobar"записаний у user_idстовпчик, завантаження припиниться, якби вказано вищевказаний тип.
Приклад розбитих даних, які розбиваються при визначенні 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'
типи, як правило, нумеровані речі, детальніше про них читайте тут:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Які типи існують?
У нас є доступ до numpy-типів: float, int, bool, timedelta64 [ns] і datetime64 [ns]. Зауважте, що нумеровані дати / часові типи не відомі часовому поясу.
Pandas розширює цей набір типів власних:
'datetime64 [ns,]' Що є часовою позначкою часового поясу.
'категорія', яка по суті є перерахуванням (рядки, представлені цілими ключами для збереження
'period []' Не плутати з тиммеделтою, ці об'єкти фактично прив’язані до певних часових періодів
'Sparse', 'Sparse [int]', 'Sparse [float]' призначений для розріджених даних або 'Data, у яких багато дірок' Замість збереження NaN або None у фреймі даних він опускає об'єкти, економлячи місце .
"Інтервал" є власною темою, але його основне використання використовується для індексування. Детальніше дивіться тут
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' - це цілі цілі цілі числа панд, які є нульовими, на відміну від numpy-варіанту.
'string' - це специфічний тип роботи для даних із рядковими даними та надає доступ до .strатрибуту серії.
'boolean' - це як numpy 'bool', але він також підтримує відсутні дані.
Прочитайте повну посилання тут:
Посилання на тип панди
Готчі, застереження, замітки
Налаштування dtype=objectзамовчуватиме вищезазначене попередження, але не зробить його більш ефективним у пам’яті.
Налаштування dtype=unicodeнічого не зробить, оскільки для нумерування, a unicodeпозначається як object.
Використання перетворювачів
@sparrow правильно вказує на використання перетворювачів, щоб уникнути вибуху панд при зустрічі 'foobar'в стовпці, вказаному якint . Я хотів би додати, що перетворювачі дійсно важкі та неефективні для використання в пандах, і їх слід використовувати в крайньому випадку. Це тому, що процес read_csv - це єдиний процес.
CSV-файли можна обробляти по черзі, і таким чином вони можуть оброблятись декількома перетворювачами паралельно ефективніше, просто розрізаючи файл на сегменти та виконуючи кілька процесів, що панда не підтримує. Але це вже інша історія.