Застарений варіант 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-файли можна обробляти по черзі, і таким чином вони можуть оброблятись декількома перетворювачами паралельно ефективніше, просто розрізаючи файл на сегменти та виконуючи кілька процесів, що панда не підтримує. Але це вже інша історія.