Минимизируйте размер файла при сохранении фрейма данных pandas

Я хочу записать фрейм данных pandas в файл. У меня есть около 200 МБ данных csv. Какое расширение файла я должен написать, чтобы размер файла был минимальным?

Я открыт для записи в двоичном формате, а также буду использовать только фрейм данных для работы.

ОБНОВЛЕНИЕ: в моем случае использование сжатого формата zip работало лучше всего (с точки зрения хранения). Но с точки зрения времени выполнения формат pickle (.pkl) читался и сохранялся быстрее всего. Я не пробовал паракет и перо из-за дополнительных зависимостей, которые ему требовались.

Отвечает ли это на ваш вопрос? Как обратимо хранить и загружать фрейм данных Pandas на/с диска

Jan 14.02.2023 14:20
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
1
57
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Используя стандартную библиотеку Pandas, лучше всего использовать двоичный файл pickle. Для получения подробной информации вам может быть полезно следующее видео

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

Community 17.02.2023 21:24

Запись в паркетный файл может быть хорошим вариантом. Требуются библиотеки pyarrow или fastparquet. Смотрите документацию здесь


    df = pd.DataFrame(data = {'col1': [1, 2], 'col2': [3, 4]})
    df.to_parquet('df.parquet.gzip',
                  compression='gzip')  
    pd.read_parquet('df.parquet.gzip')

Файлы паркета могут достигать высокой степени сжатия.

Вы можете просто сжать свой csv, используя расширение .zip вместо .csv:

# A zip archive with only one file
df.to_csv('export.zip')

# Or to get more control
df.to_csv('export.zip', compression = {'method': 'zip', 'compresslevel': 9})

# You can read the file with
df = pd.read_csv('export.zip')

Если вы сохраняете свои данные в CSV-файлы, то в pandas уже есть встроенное ключевое слово compression (doc)

Вы можете использовать его следующим образом:

df.to_csv("my_data.csv.zip", compression = "zip")
Ответ принят как подходящий

Я создал тестовый фрейм данных, который имеет псевдопанельный формат. Очевидно, что степень вашего сжатия и т. д. всегда будет зависеть от ваших данных. Если ваши данные буквально повторяют одно и то же снова и снова, степень сжатия будет высокой. Если ваши данные никогда не повторяются, степень сжатия будет низкой.

Чтобы получить ответы на ваши данные, возьмите образец ваших данных с помощью df.sample(10_000) (или что-то в этом роде) и выполните код, подобный моему ниже, который сохранит его в разных форматах. Потом сравните размеры.

import random
df = pd.DataFrame({
    'd': range(0, 10_000),
    's': [random.choice(['alpha', 'beta', 'gamma', 'delta'])
          for _ in range(0, 10_000)],
    'i': [random.randint(0, 1000) for _ in range(0, 10_000)]
})

Затем я запросил длину следующих форматов сохранения.

l = []
for p in ['.csv', '.csv.gz', '.csv.xz', '.csv.bz2', '.csv.zip']:
    df.to_csv('temp' + p)
    l.append({'name': 'temp' + p, 'size': getsize('temp' + p)})

for p in ['.pkl', '.pkl.gz', '.pkl.xz', '.pkl.bz2']:
    df.to_pickle('temp' + p)
    l.append({'name': 'temp' + p, 'size': getsize('temp' + p)})

for p in ['.xls', '.xlsx']:
    df.to_excel('temp' + p)
    l.append({'name': 'temp' + p, 'size': getsize('temp' + p)})
    
for p in ['.dta', '.dta.gz', '.dta.xz', '.dta.bz2']:
    df.to_stata('temp' + p)
    l.append({'name': 'temp' + p, 'size': getsize('temp' + p)})

cr = pd.DataFrame(l)
cr['ratio'] = cr['size'] / cr.loc[0, 'size']
cr.sort_values('ratio', inplace=True)

Получилась следующая таблица:

            name    size     ratio
7    temp.pkl.xz   22532  0.110395
8   temp.pkl.bz2   23752  0.116372
13   temp.dta.xz   39276  0.192431
6    temp.pkl.gz   40619  0.199011
2    temp.csv.xz   42332  0.207404
14  temp.dta.bz2   51694  0.253273
3   temp.csv.bz2   54801  0.268495
12   temp.dta.gz   57513  0.281783
1    temp.csv.gz   70219  0.344035
4   temp.csv.zip   70837  0.347063
11      temp.dta  170912  0.837377
5       temp.pkl  180865  0.886141
0       temp.csv  204104  1.000000
10     temp.xlsx  216828  1.062341
9       temp.xls  711168  3.484341

Я не пробовал to_parquet или to_feather, потому что они требуют зависимости pyarrow, которая нестандартна в Anaconda.

Запуск экспорта в формат Excel 2003 выдал предупреждение о том, что xlwt больше не поддерживается и будет удален. Поскольку размер файла его реализации на Python настолько огромен, это не представляет большой потери.

Другие вопросы по теме