Зарегистрируйтесь, чтобы продолжить обучение

Чтение и запись табличных данных в файловую систему Python: Pandas

Библиотека 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 файлов — наиболее популярных форматов хранения табличных данных.

Данные форматы позволяют хранить таблицы в структурированной форме, но при этом данная форма может сильно варьироваться:

  • Могут использоваться различные варианты разделителей значений в столбцах
  • Строки описания данных могут появляться в шапке таблице
  • Индексы могут храниться не в привычном крайнем левом столбце

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

  • Пропускать первые строки в таблице
  • Явно указывать столбец с индексом при чтении
  • Игнорировать названия столбцов и индексы при записи таблиц
  • Архивировать таблицы для сохранения дискового пространства

Дополнительные материалы

  1. Краткий туториал по Pandas с примерами

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»