Таблицы pandas #
pandas.DataFrame — по сути дела таблица, на которую можно смотреть как на объединение столбцов pandas.Series с выравниванием по общему индексу.
s1 | s2 | |
---|---|---|
a | 1 | NaN |
b | 2 | two |
c | <NA> | three |
Таблицы изменяемы с точки зрения содержимого их ячеек, но лишь частично изменяемы с точки зрения размера: добавлять на месте можно только столбцы, но не строки.
Создание таблицы#
Как и в случае со столбцами, есть множество способов создать таблицу pandas из уже существующих объектов python . Большинство из них опираются на конструктор pandas.DataFrame.
Список списков или двухмерный массив NumPy #
Если ваши данные хранятся в виде списка списков, то на выходе каждый вложенный список будет соответствовать строке таблице.
0 | 1 | 2 | |
---|---|---|---|
0 | a11 | a12 | a13 |
1 | a21 | a22 | a23 |
По умолчанию генерируется RangeIndex и для строк и для столбцов таблицы.
Опциональными параметрами конструктора columns и index можно указать пользовательские значения.
column 1 | column 2 | column 3 | |
---|---|---|---|
row 1 | a11 | a12 | a13 |
row 2 | a21 | a22 | a23 |
Если вместо списка списков передавать двухмерный массив NumPy , то все будет работать точно также, кроме возможной потери типов.
column 1 | column 2 | column 3 | |
---|---|---|---|
row 1 | a11 | a12 | a13 |
row 2 | a21 | a22 | a23 |
Словарь#
Один самых удобных способов создавать таблицу в pandas — использовать словари.
Тут возможно два варианта.
ключи словаря — названия столбца, значение по ключу — содержимое соответствующего столбца;
ключи словаря — метки строк, значение по ключу — содержимое соответствующей строки.
По столбцам#
Первый вариант гораздо более распространен, поэтому его рассмотрим первым. Итак, ключи словаря станут названиями столбцов, значение по ключу — станет содержимым с соответствующим значением.
Будущие столбцы в словари могут быть представлены списком, массивом NumPy , а также столбцом pandas . При этом в случае списков и массивов NumPy накладывается требование на одинаковую длину всех столбцов, а также автоматически генерируется RangeIndex, если он не указан в явном виде опциональным параметром index .
column 1 | column 2 | column 3 | |
---|---|---|---|
a | a11 | a21 | a31 |
b | a21 | a22 | a32 |
Если же содержимое будущих столбцов представлено в виде столбцов pandas , то индекс таблицы генерируется из индексов этих столбцов, а ограничение на одинаковую длину столбцов снимается: строки таблицы выравниваются по индексу.
column 1 | column 2 | column 3 | |
---|---|---|---|
a | 1.0 | 4 | 5 |
b | 2.0 | 3 | 6 |
c | NaN | <NA> | 7 |
По строкам#
Статический метод pandas.DataFrame.form_dict — более специализированный метод для создания таблицы из словаря. В примерах из предыдущего раздела этот метод сработает точно также, как и базовый конструктор класса, но наличие дополнительного опционального параметра orient ( orientation ) позволяет создавать таблицу из строк.
Если указать в качестве orient строку index , то ключи словаря будут восприниматься в качестве меток строк, а значение по ключу — содержимое строки с соответствующей меткой. Все остальное продолжает работать также, но с заменой меток и названий столбцов местами.
column 1 | column 2 | |
---|---|---|
row1 | 1 | 2 |
row2 | 4 | 3 |
Чтение таблиц с жесткого диска#
Библиотека pandas позволяет свободно оперировать с таблицами в формате csv , json , таблицами excel (потребуется установка дополнительной библиотеки, например, openpyxl), а также более продвинутыми бинарными форматами hdf5, apache parquet и многими другими форматами. Формат csv — один из самых простых и распространенных в научной среде, поэтому рассмотрим чтение таблиц средствами pandas именно на его примере.
Все таблицы из этой лекции хранятся в репозитории с исходниками этого ресурса в папке по ссылке.
Предположим следующее содержимое хранится в текстовом файле planets.csv со следующим содержимым.
Для чтения такой таблицы используется метод read_csv.
Название | Количество спутников | Масса | Группа | Кольца | |
---|---|---|---|---|---|
0 | Меркурий | 0 | 0.0055 | земная группа | Нет |
1 | Венера | 0 | 0.8150 | земная группа | Нет |
2 | Земля | 1 | 1.0000 | земная группа | Нет |
3 | Марс | 2 | 0.1070 | земная группа | Нет |
4 | Юпитер | 62 | 317.8000 | газовый гигант | Да |
В самом простом варианте использования функции read_csv
имена столбцов распознаются из первой строки файла (параметром header можно повлиять на это);
в качестве индекса генерируется RangeIndex (параметром index_col можно выбрать столбец индекса таблицы);
в качестве разделителя ожидается символ запятой “ , ” (параметром sep можно на это повлиять);
пропущенные значения заполняются значением “ np.nan ” (параметром na_values можно указать, какие ещё значения интерпретировать, как пропущенные);
столбцы с датами не распознаются (смотри страницу “ Дата и время ”).
Метод DataFrame.head возвращает первые n строк таблицы. По умолчанию n равно 5, но можно указать явно и другое значение. Похожий по смыслу метод DataFrame.tail возвращает последние n строк.
Метод DataFrame.info печатает информацию о таблице. В частности, из вывода этой функции можно понять количество строк и столбцов, тип индекса таблицы, имя каждого столбца, тип данных и количество непропущенных значений в них.
Считаем эту таблицу ещё раз, указав в этот раз в качестве индекса столбец "Название" .
Количество спутников | Масса | Группа | Кольца | |
---|---|---|---|---|
Название | ||||
Меркурий | 0 | 0.0055 | земная группа | Нет |
Венера | 0 | 0.8150 | земная группа | Нет |
Земля | 1 | 1.0000 | земная группа | Нет |
Марс | 2 | 0.1070 | земная группа | Нет |
Юпитер | 62 | 317.8000 | газовый гигант | Да |
Сатурн | 34 | 95.2000 | газовый гигант | Да |
Уран | 27 | 14.3700 | ледяной гигант | Да |
Нептун | 13 | 17.1500 | ледяной гигант | Да |
Аналогично можно считывать данные из таблиц excel методом read_excel.
Методами to_csv и to_excel можно сохранить DataFrame в таблицу удобном формате (для сохранения в excel необходимо поставить библиотеку openpyxl или её аналоги).
Индексация#
Строки#
Для получения строк таблицы используются те же самые .loc и iloc (метки и порядковый номер соответственно).
В ответ вы получаете объект pandas.Series соответствующей всей строке, при этом индекс этого объекта соответствует названиям столбцов. Если использовать срезы или список меток, то вы получите новую таблицу с, возможно, меньшим количеством строк.
Простые квадратные скобки “ [] ” не индексируют таблицу по строкам!
Столбцы#
Для получения столбца используется оператор “ [] ”.
Если в названии столбца нет пробелов и оно не совпадает ни с одним методом класса pandas.DataFrame , то можно использовать точечную нотацию. Хотя, конечно, в случае кириллицы это выглядит странно.
Можно указывать список названий столбцов, чтобы извлечь сразу подтаблицу целиком.
А вы знаете о том, что в Python есть встроенная СУБД?
Если вы — программист, то я полагаю, что вы, наверняка, знаете о существовании чрезвычайно компактной и нетребовательной к ресурсам СУБД SQLite, или даже пользовались ей. Эта система обладает практически всеми возможностями, которых можно ожидать от реляционной СУБД, но при этом всё хранится в единственном файле. Вот некоторые сценарии использования SQLite, упомянутые на официальном сайте этой системы:
- Встраиваемые устройства и IoT.
- Анализ данных.
- Перенос данных из одной системы в другую.
- Архивирование данных и (или) упаковка данных в контейнеры.
- Хранение данных во внешней или временной БД.
- Заменитель корпоративной БД, используемый в демонстрационных или испытательных целях.
- Обучение, освоение начинающими практических приёмов работы с БД.
- Прототипирование и исследование экспериментальных расширений языка SQL.
Данный материал посвящён использованию SQLite в Python-разработке. Поэтому для нас особенно важно то, что эта СУБД, представленная модулем sqlite3 , входит в стандартную библиотеку языка. То есть оказывается, что для работы с SQLite из Python-кода не нужно устанавливать некое клиент-серверное ПО, не нужно поддерживать работу какого-то сервиса, отвечающего за работу с СУБД. Достаточно лишь импортировать модуль sqlite3 и приступить к его использованию в программе, получив в своё распоряжение систему управления реляционными базами данных.
Импорт модуля
Выше я говорил о том, что SQLite — это СУБД, встроенная в Python. Это значит, что для того чтобы приступить к работе с ней, достаточно импортировать соответствующий модуль, не выполняя предварительно его установку с помощью команды вроде pip install . Команда импорта SQLite выглядит так:
Создание подключения к БД
Для организации подключения к базе данных SQLite не нужно беспокоиться об установке драйверов, о подготовке строк подключения и о прочих подобных вещах. Создать базу данных и получить в своё распоряжение объект подключения к ней можно очень просто и быстро:
Выполнив эту строку кода, мы создадим базу данных и подключимся к ней. Дело тут в том, что база данных, к которой мы подключаемся, пока не существует, поэтому система автоматически создаёт новую пустую БД. Если же база данных уже создана (предположим, это my-test.db из предыдущего примера), для того чтобы к ней подключиться, достаточно воспользоваться точно таким же кодом.
Файл только что созданной базы данных
Создание таблицы
Теперь давайте создадим таблицу в нашей новой БД:
Тут описано добавление в БД таблицы USER с тремя столбцами. Как видите, SQLite — это и правда очень простая в работе СУБД, но она обладает всеми основными возможностями, наличия которых можно ожидать от обычной системы управления реляционными базами данных. Речь идёт о поддержке типов данных, в том числе — типов, допускающих значение null , о поддержке первичного ключа и автоинкремента.
Если этот код функционирует так, как ожидается (вышеприведённая команда, правда, ничего не возвращает), в нашем распоряжении окажется таблица, готовая к дальнейшей работе с ней.
Вставка записей в таблицу
Вставим несколько записей в таблицу USER , которую мы только что создали. Это, кроме прочего, даст нам доказательство того, что таблица, и правда, была создана вышеприведённой командой.
Представим, что нам нужно добавить в таблицу несколько записей одной командой. В SQLite сделать это очень просто:
Здесь нам нужно определить SQL-выражение со знаками вопроса ( ? ) в виде местозаполнителей. Учитывая то, что в нашем распоряжении есть объект подключения к базе данных, мы, подготовив выражение и данные, можем вставить записи в таблицу:
Сообщений об ошибках после выполнения этого кода не поступает, а это значит, что данные успешно добавлены в таблицу.
Выполнение запросов к базе данных
Теперь пришло время узнать о том, правильно ли отработали команды, которые мы только что выполняли. Давайте выполним запрос к БД и попробуем получить из таблицы USER какие-то данные. Например — получим записи, относящиеся к пользователям, возраст которых не превышает 22 года:
Результат выполнения запроса к БД
Как видите, то, что было нужно, получить удалось. И сделать это было очень просто.
Кроме того, даже хотя SQLite — простая СУБД, она отличается крайне широкой поддержкой. Поэтому с ней можно работать, используя большинство SQL-клиентов.
Я пользуюсь DBeaver. Предлагаю взглянуть на то, как это выглядит.
Подключение к базе данных SQLite из SQL-клиента (DBeaver)
Я пользуюсь облачным сервисом Google Colab и хочу загрузить файл my-test.db на свой компьютер. Если же вы экспериментируете с SQLite на компьютере, то это значит, что вы, без необходимости скачивать откуда-то файл базы данных, можете подключиться к ней, используя SQL-клиент.
В случае с DBeaver для подключения к БД SQLite нужно создать новое подключение и выбрать, в качества типа базы данных, SQLite.
Подготовка подключения в DBeaver
Затем надо найти файл базы данных.
Подключение файла базы данных
После этого можно выполнять SQL-запросы к базе данных. Тут нет ничего особенного, отличающегося от работы с обычными реляционными БД.
Выполнение запросов к базе данных
Интеграция с pandas
Думаете, на этом мы завершим разговор о поддержке SQLite в Python? Нет, нам ещё есть о чём поговорить. А именно, так как SQLite — это стандартный Python-модуль, эта СУБД легко интегрируется с дата-фреймами pandas.
Датафрейм pandas
Для сохранения датафрейма в БД можно просто воспользоваться его методом to_sql() :
Вот и всё! Нам даже не нужно заранее создавать таблицу. Типы данных и характеристики полей будут настроены автоматически, на основании характеристик датафрейма. Конечно, вы, если надо, можете настроить всё самостоятельно.
Теперь, предположим, нам нужно получить объединение таблиц USER и SKILL и записать полученные данные в датафрейм pandas. Это тоже очень просто:
Чтение данных из БД в датафрейм pandas
Замечательно! А теперь давайте запишем то, что у нас получилось, в новую таблицу с именем USER_SKILL :
С этой таблицей, конечно, можно работать и пользуясь SQL-клиентом.
Применение SQL-клиента для работы с базой данных
Итоги
В Python, безусловно, есть много приятных неожиданностей, которые, если специально их не искать, можно и не заметить. Специально подобные возможности никто не прятал, но из-за того, что в Python встроено очень много всего, на некоторые из таких возможностей можно просто не обратить внимания, или, откуда-то о них узнав, просто о них забыть.
Здесь я рассказал о том, как использовать встроенную в Python библиотеку sqlite3 для создания баз данных и для работы с ними. Конечно, такие БД поддерживают не только операцию добавления данных, но и операции изменения и удаления информации. Полагаю, вы, узнав о sqlite3 , испытаете всё это сами.
Очень важно то, что SQLite отлично стыкуется с pandas. Данные из БД очень легко считывать, помещая в датафреймы. Не менее проста и операция по сохранению содержимого датафреймов в базу данных. Это ещё сильнее упрощает использование SQLite.
Предлагаю всем, кто дочитал до этого места, заняться собственными исследованиями в поиске интересных возможностей Python!
Как ввести таблицу в питоне
In this article, we are going to discuss how to make a table in Python. Python provides vast support for libraries that can be used for creating different purposes. In this article we will talk about two such modules that can be used to create tables.
Method 1: Using Tabulate module
The tabulate() method is a method present in the tabulate module which creates a text-based table output inside the python program using any given inputs. It can be installed using the below command
How to Easily Create Tables in Python
How to use the tabulate function to create nicely-formatted tables in Python
Towards Data Science
Being able to quickly organize our data into a more readable format, such as when data wrangling, can be extremely helpful in order to analyze the data and plan the next steps. Python offers the ability to easily turn certain tabular data types into nicely formatted plain-text tables, and that’s with the tabulate function.
install tabulate
We first install the tabulate library using pip install in the command line:
import tabulate function
We then import the tabulate function from the tabulate library in our code:
And now we are ready to use the tabulate function!
tabular data types supported by tabulate
The tabulate function can transform any of the following into an easy to read plain-text table: (from the tabulate documentation)
- list of lists or another iterable of iterables
- list or another iterable of dicts (keys as columns)
- dict of iterables (keys as columns)
- two-dimensional NumPy array
- NumPy record arrays (names as columns)
- pandas.DataFrame
list of lists
For example, if we have the following list of lists:
We can turn it into into a much more readable plain-text table using the tabulate function:
Since the first list in the list of lists contains the names of columns as its elements, we can set it as the column or header names by passing ‘firstrow’ as the argument for the headers parameter:
The tabulate function also contains a tablefmt parameter, which allows us to improve the appearance of our table using pseudo-graphics:
I prefer to use the ‘fancy_grid’ argument for tablefmt: