Я хочу записать фрейм данных pandas в файл. У меня есть около 200 МБ данных csv. Какое расширение файла я должен написать, чтобы размер файла был минимальным?
Я открыт для записи в двоичном формате, а также буду использовать только фрейм данных для работы.
ОБНОВЛЕНИЕ: в моем случае использование сжатого формата zip работало лучше всего (с точки зрения хранения). Но с точки зрения времени выполнения формат pickle (.pkl) читался и сохранялся быстрее всего. Я не пробовал паракет и перо из-за дополнительных зависимостей, которые ему требовались.
Используя стандартную библиотеку Pandas, лучше всего использовать двоичный файл pickle. Для получения подробной информации вам может быть полезно следующее видео
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Запись в паркетный файл может быть хорошим вариантом. Требуются библиотеки 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 настолько огромен, это не представляет большой потери.
Отвечает ли это на ваш вопрос? Как обратимо хранить и загружать фрейм данных Pandas на/с диска