Библиотека Pandas разрабатывалась для работы с табличными данными. Популярными типами файлов для их хранения являются:
- csv — текстовый формат, в котором значения в столбцах отделены друг от друга разделителем, часто запятой
- xlsx или xls — форматы файлов электронных таблиц Microsoft Excel
Для чтения и записи таблиц в указанные форматы в Pandas существуют специальные методы. О них пойдет речь в этом уроке.
Чтение данных
Начнем работу с продажами в сети из четырех магазинов за одну неделю, которые хранятся в формате csv с запятой в качестве разделителя. Воспользуемся методом read_csv()
:
df_orders = pd.read_csv('./data/Shop_orders.csv')
print(df_orders.head())
# => Weekday Shop_1 Shop_2 Shop_3 Shop_4
# 0 mon 7 1 7 8
# 1 tue 4 2 4 5
# 2 wed 3 5 2 3
# 3 thu 8 12 8 7
# 4 fri 15 11 13 9
При чтении данных метод не знает, что считать за индекс в данных, поэтому расставляет индексы самостоятельно. Это возрастающая последовательность целых чисел, которая начинается с нуля. В нашем примере явным индексом является первый столбец — Weekday. Дополним метод параметром index_col
с явным указанием номера столбца, который хранит индексы:
df_orders = pd.read_csv('./data/Shop_orders.csv', index_col=0)
print(df_orders.head())
# => Shop_1 Shop_2 Shop_3 Shop_4
# Weekday
# mon 7 1 7 8
# tue 4 2 4 5
# wed 3 5 2 3
# thu 8 12 8 7
# fri 15 11 13 9
У разделителя в данных формата csv есть важное значение при чтении. По умолчанию это запятая. Попытка считать данные с разделителем в виде точки с запятой приведет к некорректному чтению. В примере ниже в результате получается пустой DataFrame
, в котором индексами стали данные в строках — не то, что хотелось получить:
df_orders = pd.read_csv('./data/Shop_orders_sep.csv', index_col=0)
print(df_orders.head())
# => Empty DataFrame
# Columns: []
# Index: [mon;7;1;7;8, tue;4;2;4;5, wed;3;5;2;3, thu;8;12;8;7, fri;15;11;13;9]
Для корректного чтения в данном случае достаточно воспользоваться параметром sep
:
df_orders = pd.read_csv('./data/Shop_orders_sep.csv', index_col=0, sep=';')
print(df_orders.head())
# => Shop_1 Shop_2 Shop_3 Shop_4
# Weekday
# mon 7 1 7 8
# tue 4 2 4 5
# wed 3 5 2 3
# thu 8 12 8 7
# fri 15 11 13 9
Иногда описание данных может предшествовать началу самих табличных данных. В примере ниже файл начинается со строк:
Several lines
with a possible description of
the data
Попытка прочитать данный файл повлечет ошибку:
df_orders = pd.read_csv('./data/Shop_orders_abstract.csv', index_col=0)
print(df_orders.head())
# => ParserError: Error tokenizing data. C error: Expected 1 fields in line 4, saw 5
Чтобы пропустить ряд строк с описанием, нужно воспользоваться параметром skiprows
. Его значение — это количество опускаемых из рассмотрения первых строк в файле:
df_orders = pd.read_csv('./data/Shop_orders_abstract.csv', index_col=0, skiprows=3)
print(df_orders.head())
# => Shop_1 Shop_2 Shop_3 Shop_4
# Weekday
# mon 7 1 7 8
# tue 4 2 4 5
# wed 3 5 2 3
# thu 8 12 8 7
# fri 15 11 13 9
Запись данных
После чтения и трансформации данных результаты могут быть сохранены в файловую систему. Для этого в Pandas есть ряд специальных методов. Для рассматриваемых типов данных это to_csv()
и to_excel()
:
df_orders.to_csv('./data/Shop_orders_restore.csv')
В примере выше метод to_csv()
позволяет сохранить DataFrame в изначальном виде. Если в качестве индекса сохранить значения, которые присвоены Pandas по умолчанию, то это может мешать дальнейшему чтению и обработке. Также такие индексы не несут важной информации.
У нас есть такие данные:
# => Weekday Shop_1 Shop_2 Shop_3 Shop_4
# 0 mon 7 1 7 8
# 1 tue 4 2 4 5
# 2 wed 3 5 2 3
# 3 thu 8 12 8 7
# 4 fri 15 11 13 9
Для них с индексами по умолчанию достаточно воспользоваться параметром index
, чтобы не сохранять их файл:
df_orders.to_csv('./data/Shop_orders_restore.csv', index=False)
В команде разработки можно проговорить, что будет использоваться в качестве разделителя в csv-файле. Также это может быть продиктовано совместимостью с другими частями программного продукта. Чтобы задать разделитель, нужно использовать параметр sep
:
df_orders.to_csv('./data/Shop_orders_restore_sep.csv', index=False, sep=';')
Метод to_excel()
позволяет сохранять табличные данные в формат MS Excel. Параметризация аналогична методу to_csv()
. Меняется только название метода и расширение файла с .csv
на .xlsx
:
df_orders.to_excel('./data/Shop_orders_restore.xlsx', index=False)
В некоторых случаях сохранение названий столбцов также можно отключить. Это может потребоваться, когда нужно сохранить значения в ячейках таблицы, или когда названия столбцов не несут дополнительной информации, и не предполагается их использование. Для этого достаточно задать параметр header
значением False:
df_orders.to_excel('./data/Shop_orders_restore_noheader.xlsx', index=False, header=False)
Большие таблицы текстовых данных занимают большой объем. Чтобы уменьшить его, можно создавать архивы методами Pandas. Для этого нужно определить метод сжатия и названия файла в архиве, при этом указать их в виде словаря в параметре compression
:
df_orders.to_csv(
'./data/Shop_orders_restore.zip',
index=False,
compression={'method': 'zip', 'archive_name': 'Shop_orders_restore_archive.csv'}
)
Выводы
Данные для долгосрочного хранения размещают в виде файлов на жестких дисках. В данном уроке методами библиотеки Pandas выполнялись операции чтения и записи csv и xlsx файлов — наиболее популярных форматов хранения табличных данных.
Данные форматы позволяют хранить таблицы в структурированной форме, но при этом данная форма может сильно варьироваться:
- Могут использоваться различные варианты разделителей значений в столбцах
- Строки описания данных могут появляться в шапке таблице
- Индексы могут храниться не в привычном крайнем левом столбце
В уроке на практических примерах показано, как действовать в таких ситуациях. Конфигурацией параметров методов мы научились:
- Пропускать первые строки в таблице
- Явно указывать столбец с индексом при чтении
- Игнорировать названия столбцов и индексы при записи таблиц
- Архивировать таблицы для сохранения дискового пространства
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.