Pandas — обработка и анализ данных

Pandas – обработка и анализ данных в Python

Подробный обзор библиотеки Pandas. Гибкая и мощная библиотека для анализа и обработки данных, разработанная на языке программирования Python.

Введение

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

Series — это структура данных принципиально похожая на список и словарь в Python. Используется в качестве столбцов в таблице.

DataFrame — если говорить простыми словами, то эта структура данных представляет из себя обычную таблицу. Иными словами табличная структура данных. Как и во всех таблицах она состоит из строк и столбцов. Столбцами выступают объекты Series, а строки его элементы.

Установка

Pandas как и все библиотеки в Python устанавливаются стандартным методом через пакетный менеджер pip.

pip install pandas

Использование

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

import pandas as pd

df = pd.DataFrame({
    'Страна': ['Россия', 'Казахстан', 'Украина', 'Белоруссия', 'Узбекистан'],
    '2017 год': [1665, 179, 131, 60, 50],
    '2018 год': [1702, 182, 154, 63, 58],
})

df

   Страна  2017 год  2018 год
 0      Россия      1665      1702
 1   Казахстан       179       182
 2     Украина       131       154
 3  Белоруссия        60        63
 4  Узбекистан        50        58

Объект DataFrame имеет два индекса по столбцам и строкам. Если индекс по строкам не указан вручную, то pandas задает его автоматически.

Индексы

Назначать индексы объекту DataFrame можно при его создании или в процессе работы с ним.

import pandas as pd

df = pd.DataFrame({
    'Страна': ['Россия', 'Казахстан', 'Украина', 'Белоруссия', 'Узбекистан'],
    '2017 год': [1665, 179, 131, 60, 50],
    '2018 год': [1702, 182, 154, 63, 58],
}, index=['RU', 'KZ', 'UA', 'BY', 'UZ']
)

df

    Страна  2017 год  2018 год
 RU      Россия      1665      1702
 KZ   Казахстан       179       182
 UA     Украина       131       154
 BY  Белоруссия        60        63
 UZ  Узбекистан        50        58

Вызывая метод DataFrame мы передали ему аргумент index со списком именованных индексов.

Фильтрация данных

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

По столбцу

Обращение к столбцам в pandas реализовано стандартным образом, так как будто вы обращаетесь к ключу словаря, или же к методу объекта. В моем случае обращение как к методу объекта невозможно, я выбрал кириллическое название столбца, а работает только с латиницей 🙂

df["Страна"]

RU        Россия
KZ     Казахстан
UA       Украина
BY    Белоруссия
UZ    Узбекистан
Name: Страна, dtype: object

По строковому индексу

Для обращения к строковым индекса существуют два метода

  • loc — для доступа по именованному индексу
  • iloc — для доступа по числовому индексу
df.loc["RU"]

Страна      Россия
2017 год      1665
2018 год      1702
Name: RU, dtype: object

Обращение к именованному индексу RU

df.iloc[0]

Страна      Россия
2017 год      1665
2018 год      1702
Name: RU, dtype: object

Обращение к числовому индексу

По срезами

Объект DataFrame поддерживает использование срезов.

df[2:]

    Страна  2017 год  2018 год
UA     Украина       131       154
BY  Белоруссия        60        63
UZ  Узбекистан        50        58

Отобразим все строки начиная с 3.

С использованием условий

Мы так же можем использовать логику в фильтрации данных. Давайте отобразить странны, в которых ВВП на душу населения в 2018 году был больше 100$

df[df["2018 год"] > 100]['Страна']

RU       Россия
KZ    Казахстан
UA      Украина
Name: Страна, dtype: object

Работа с столбцами

Вы можете создавать, удалять и переименовывать ваши столбцы в любой момент времени.

Давайте рассмотрим каждый момент по внимательнее.

Переименование

Для переименования столбца существует метод rename

Давайте переименуем наши столбцы с указанием года.

df.rename(columns={'2018 год': '2018', '2017 год': '2017'})

    Страна  2017  2018
RU      Россия  1665  1702
KZ   Казахстан   179   182
UA     Украина   131   154
BY  Белоруссия    60    63
UZ  Узбекистан    50    58

Метод rename на вход принимает обычный словарь, ключ который является текущем названием столбца, а значение — новым. За один раз мы можем переименовать сколько угодно столбцов, главное не забывайте разделять элементы словаря запятой.

Важно: результат выполнение метода rename возвращает новый измененный объект DataFrame, поэтому переназначь основной экземпляр DataFrame.

Создание

Создадим новую колонку «Рост» и наполним ее значениями высчитанными из разницы 2018 к 2017 году.

df['Рост'] = df["2018"] - df["2017"]

    Страна  2017  2018  Рост
RU      Россия  1665  1702    37
KZ   Казахстан   179   182     3
UA     Украина   131   154    23
BY  Белоруссия    60    63     3
UZ  Узбекистан    50    58     8

В этой ситуации объект изменяется и переназначать экземпляр нам не нужно.

Удаление

Для удаления столбца существует метод drop, так же необходимо передать в аргумент axis значение index или columns.

df.drop(["Рост"], axis="columns")

  index  Страна   2017   2018
0   RU      Россия  1665  1702
1   KZ   Казахстан   179   182
2   UA     Украина   131   154
3   BY  Белоруссия    60    63
4   UZ  Узбекистан    50    58

Важно: результат выполнение метода drop возвращает новый измененный объект DataFrame, поэтому не забудьте переназначить DataFrame.

Загрузка данных

API загрузки данных имеет поддержку множество структурированных форматов. Для примера возьмем информацию из реестра специалистов в области ветеринарии, занимающихся предпринимательской деятельностью на территории Санкт-Петербурга. На сайте есть ссылочка для скачивания таблиц в формате CSV и MS Excel эти два формата мы и рассмотрим.

Из таблицы CSV

Осуществить загрузку данных в таблицу можно используя метод read_csv

vet_csv = pd.read_csv("vetpet.csv")
vet_csv

   registration_number                           name  ... number                                              notes
0         УВ № 7800001       Макеева Елена Евгеньевна  ...      1                                                NaN
1         УВ № 7800001       Макеева Елена Евгеньевна  ...      2                                                NaN
2         УВ № 7800002       Макеева Елена Евгеньевна  ...      3                                                NaN
3        УВ № 78-00003    Пономаренко Андрей Иванович  ...      4                                     Помещение Н-13
4        УВ № 78-00004   Уманский Игорь Александрович  ...      5  Ветеринарная помощь животным на дому у владель...
..                 ...                            ...  ...    ...                                                ...
77       УВ № 78-00068     Иванов Михаил Владимирович  ...     78                                       Помещение 5Н
78       УВ № 78-00069        Сотникова Инна Петровна  ...     79                                                NaN
79       УВ № 78-00070    Вахтина Оксана Владимировна  ...     80                                                NaN
80       УВ № 78-00071      Цинаридзе Елена Сергеевна  ...     81                                                NaN
81       УВ № 78-00072  Алистратов Дмитрий Викторович  ...     82                                   Помещения 3Н, 9Н

[82 rows x 10 columns]

Полный список поддерживаемых аргументов для метода read_csv

Из таблицы MS Excel

За загрузку данных из excel таблицы отвечает метод read_excel

Установка библиотеки xlrd

Для загрузки данных из таблицы MS Excel необходимо установить дополнительную библиотеку xlrd

pip install xlrd
Загрузка данных

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

vet_excel = pd.read_excel("vetpet.xlsx")
vet_excel

   registration_number                           name  ... number                                              notes
0         УВ № 7800001       Макеева Елена Евгеньевна  ...      1                                                NaN
1         УВ № 7800001       Макеева Елена Евгеньевна  ...      2                                                NaN
2         УВ № 7800002       Макеева Елена Евгеньевна  ...      3                                                NaN
3        УВ № 78-00003    Пономаренко Андрей Иванович  ...      4                                     Помещение Н-13
4        УВ № 78-00004   Уманский Игорь Александрович  ...      5  Ветеринарная помощь животным на дому у владель...
..                 ...                            ...  ...    ...                                                ...
77       УВ № 78-00068     Иванов Михаил Владимирович  ...     78                                       Помещение 5Н
78       УВ № 78-00069        Сотникова Инна Петровна  ...     79                                                NaN
79       УВ № 78-00070    Вахтина Оксана Владимировна  ...     80                                                NaN
80       УВ № 78-00071      Цинаридзе Елена Сергеевна  ...     81                                                NaN
81       УВ № 78-00072  Алистратов Дмитрий Викторович  ...     82                                   Помещения 3Н, 9Н

[82 rows x 10 columns]

Полный список поддерживаемых аргументов для метода read_excel

Список всех поддерживаемых форматов

Pandas поддерживает огромное количество форматов импорта данных, приведу полный список из официальной документации

Тип данныхФормат данныхИспользуемый метод
ТекстовыйCSVread_csv
ТекстовыйFixed-Width Text Fileread_fwf
ТекстовыйJSONread_json
ТекстовыйHTMLread_html
ТекстовыйБуфер обменаread_clipboard
БинарныйMS Excelread_excel
БинарныйOpenDocumentread_excel
БинарныйHDF5 Formatread_hdf
БинарныйFeather Formatread_feather
БинарныйParquet Formatread_parquet
БинарныйORC Formatread_orc
БинарныйMsgpackread_msgpack
БинарныйStataread_stata
БинарныйSASread_sas
БинарныйSPSSread_spss
БинарныйPython Pickle Formatread_pickle
SQLSQLread_sql
SQLGoogle BigQueryread_gbq

Сохранение данных

Так же как и в импорте API поддерживает множество форматов для экспорта данных. Воспользуемся данными о ВВП для демонстрации работы.

В таблицу CSV

За запись данных в таблицу CSV отвечает метод to_csv

import pandas as pd

df = pd.DataFrame({
    'Страна': ['Россия', 'Казахстан', 'Украина', 'Белоруссия', 'Узбекистан'],
    '2017 год': [1665, 179, 131, 60, 50],
    '2018 год': [1702, 182, 154, 63, 58],
}, index=['RU', 'KZ', 'UA', 'BY', 'UZ']
)

df.to_csv("country.csv")

так выглядят наши экспортированные данные

,Страна,2017 год,2018 год
 RU,Россия,1665,1702
 KZ,Казахстан,179,182
 UA,Украина,131,154
 BY,Белоруссия,60,63
 UZ,Узбекистан,50,58

В таблицу MS Excel

За запись данных в таблицу MS Excel отвечает метод to_excel

Установка библиотеки openpyxl

Для записи в таблицу нам понадобиться установить библиотеку openpyxl

pip install openpyxl
Сохранение данных

Запускаем наш скрипт

import pandas as pd

df = pd.DataFrame({
    'Страна': ['Россия', 'Казахстан', 'Украина', 'Белоруссия', 'Узбекистан'],
    '2017 год': [1665, 179, 131, 60, 50],
    '2018 год': [1702, 182, 154, 63, 58],
}, index=['RU', 'KZ', 'UA', 'BY', 'UZ']
)

df.to_excel("country.xlsx")

На выходе получаем такую таблицу

Pandas - обработка и анализ данных

Список всех поддерживаемых форматов

К сожалению, pandas не в полном объеме поддерживает запись во все форматы, которые он умеет читать, но с большинством из них нет никаких проблем.

Тип данныхФормат данныхИспользуемый метод
ТекстовыйCSVto_csv
ТекстовыйJSONto_json
ТекстовыйHTMLto_html
ТекстовыйБуфер обменаto_clipboard
БинарныйMS Excelto_excel
БинарныйHDF5 Formatto_hdf
БинарныйFeather Formatto_feather
БинарныйParquet Formatto_parquet
БинарныйMsgpackto_msgpack
БинарныйStatato_stata
БинарныйPython Pickle Formatto_pickle
SQLSQLto_sql
SQLGoogle BigQueryto_gbq

Визуализация данных

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

Установка библиотеки matplotlib

Для рисования графиков нам понадобится эта библиотека

pip install matplotlib

Создание графиков

Самый просто способ сгенерировать график, это передать обработчику данные для одной из координат, для второй он возьмет информацию из индекса.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    'Страна': ['Россия', 'Казахстан', 'Украина', 'Белоруссия', 'Узбекистан'],
    '2017 год': [1665, 179, 131, 60, 50],
    '2018 год': [1702, 182, 154, 63, 58],
}, index=['RU', 'KZ', 'UA', 'BY', 'UZ']
)

df.plot(kind='barh', y='2017 год', color='red')
plt.show()

После выполнения программы мы увидим вот такой график

Pandas - обработка и анализ данных

Можно повторить тоже самое но только для 2018 года

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    'Страна': ['Россия', 'Казахстан', 'Украина', 'Белоруссия', 'Узбекистан'],
    '2017 год': [1665, 179, 131, 60, 50],
    '2018 год': [1702, 182, 154, 63, 58],
}, index=['RU', 'KZ', 'UA', 'BY', 'UZ']
)

df.plot(kind='barh', y='2018 год', color='green')
plt.show()

Pandas - обработка и анализ данных

Объединение данных на одном графике

У нас есть отдельный график для 2017 и 2018 года, но как их объединить в одной диаграмме? Очень просто, нужно использовать метод pivot из библиотеки pandas.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    'Страна': ['Россия', 'Казахстан', 'Украина', 'Белоруссия', 'Узбекистан'],
    '2017 год': [1665, 179, 131, 60, 50],
    '2018 год': [1702, 182, 154, 63, 58],
}, index=['RU', 'KZ', 'UA', 'BY', 'UZ']
)

df.pivot(columns="Страна").plot(kind='bar')
plt.show()
Pandas - обработка и анализ данных

Заключение

На это обзор библиотеки pandas подошел к концу, если у вас возникли вопросы, не стесняйтесь задавать их в комментариях.

Егор Егоров

Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Светлана

    Было очень полезно получить для себя часть ценной информации,так как сама недавно начала изучать IT программирование.Много аналогичных программ,но все таки на Python анализ,мне кажется,проще делать.

    Ответить
    1. Егор Егоров автор

      Да, анализ данных в Python не сложен.

      Ответить