Библиотека Pandas – мощный инструмент для анализа и обработки табличных данных. Pandas используется в инженерных, научных и финансовых вычислениях – словом, везде, где нужны:
- Анализ, исследование, сегментация, очистка, преобразование данных. Библиотека предоставляет множество функций для загрузки и обработки данных из различных источников. С помощью Pandas можно анализировать любую информацию, исследовать ее характеристики и особенности, а также преобразовывать данные в нужный формат для дальнейшего использования – в бизнес-аналитике, машинном обучении и т.п.
- Сортировка, группировка и агрегация данных. В Pandas есть удобные функции для сортировки данных по различным критериям, группировки по определенным признакам и выполнения агрегации (суммирование, подсчет среднего значения, максимума и минимума и т.д.)
- Индексация, фильтрация и выборка многомерных данных. Pandas позволяет использовать различные типы индексов и создавать многомерные индексы с помощью MultiIndex. Это помогает легко находить, фильтровать и выбирать нужные данные по различным критериям.
- Определение эффективности и рисков, прогнозирование событий, оптимизация. Библиотеку можно использовать для прогнозирования спроса на основе исторических данных, анализа трендов и паттернов, а также для определения факторов, влияющих на эффективность бизнеса, результативность кампаний и прибыльность инвестиций.
- Работа с временными рядами. Pandas обладает мощными возможностями для работы с временными рядами – позволяет выполнять индексацию по времени, агрегацию и ресемплирование временных данных, проводит анализ и визуализацию временных рядов. Это делает Pandas идеальным инструментом для работы с IoT, финансовыми и климатическими данными и другими областями, где временные ряды играют важную роль.
- Формирование отчетов и визуализация данных. Pandas используют (совместно с Matplotlib и Seaborn) для создания отчетов и визуализации многомерных данных в виде наглядных таблиц, графиков и диаграмм.
В Pandas есть две основные высокоуровневые структуры данных – DataFrame и Series.
DataFrame – это двумерная табличная структура данных. Каждый столбец в таблице может содержать данные различного типа (числа, строки, булевы значения и т.д.). DataFrame располагает удобными методами для индексации, фильтрации, сортировки, группировки, агрегирования, слияния, объединения и преобразования данных. DataFrame можно сравнить с таблицей в реляционной базе данных или листом в Excel:
import pandas as pd
# создаем DataFrame из словаря
data = {'Имя': ['Егор', 'Анна', 'Никита', 'Марина'],
'Возраст': [25, 30, 28, 35],
'Город': ['Москва', 'Самара', 'Ростов', 'Нижний Новгород']}
df = pd.DataFrame(data)
# выводим DataFrame на экран
print(df)
Результат:
Имя Возраст Город
0 Егор 25 Москва
1 Анна 30 Самара
2 Никита 28 Ростов
3 Марина 35 Нижний Новгород
Series – это одномерная маркированная структура данных, состоящая из индексов и соответствующих значений. В качестве меток могут выступать числа, даты, временные интервалы и строки. Метки позволяют получать доступ к элементам данных по определенным уникальным именам, а не только по индексам. Это особенно удобно в тех случаях, когда нужно обращаться к конкретным значениям по определенным меткам или условиям. Series можно рассматривать как упорядоченный словарь:
import pandas as pd
data = [35000, 6000, 3000, 2000]
labels = ['Ноутбуки', 'Мониторы', 'Принтеры', 'Клавиатуры']
series = pd.Series(data, index=labels)
print(series['Принтеры']) # выводим значение 3000, обращаясь к элементу с меткой 'Принтеры'
Результат:
3000
Для операций с трехмерными данными в Pandas раньше использовалась структура Panel. Теперь вместо Panel используется MultiIndex в сочетании с DataFrame. MultiIndex позволяет создавать иерархические индексы для многомерных массивов данных:
import pandas as pd
# создаем MultiIndex с двумя уровнями
index = pd.MultiIndex.from_tuples([('Москва', 'Ноутбуки'), ('Москва', 'Настольные ПК'),
('Санкт-Петербург', 'Ноутбуки'), ('Санкт-Петербург', 'Настольные ПК')])
# создаем DataFrame с MultiIndex
data = [[1000, 200000], [3000, 400000], [5000, 600000], [7000, 800000]]
df = pd.DataFrame(data, index=index, columns=['Продажи', 'Прибыль'])
print(df)
Результат:
Продажи Прибыль
Москва Ноутбуки 1000 200000
Настольные ПК 3000 400000
Санкт-Петербург Ноутбуки 5000 600000
Настольные ПК 7000 800000
Способы создания Series
Метод pd.Series() создает одномерный массив Series из почти любых исходных данных. Так можно создать Series из списка и словаря:
import pandas as pd
# создаем Series из списка
data1 = [10, 20, 30, 40, 50]
series1 = pd.Series(data1)
# создаем Series из словаря
data2 = {'А': 10, 'Б': 20, 'В': 30, 'Г': 40, 'Д': 50}
series2 = pd.Series(data2)
print(series1)
print(series2)
Результат:
0 10
1 20
2 30
3 40
4 50
dtype: int64
А 10
Б 20
В 30
Г 40
Д 50
dtype: int64
Так при создании Series можно задать нужные метки:
import pandas as pd
data = [10, 20, 30, 40, 50]
index = ['2019', '2020', '2021', '2022', '2023']
series = pd.Series(data, index=index)
print(series)
print(series['2021']) # вывод: 30
print(series['2023']) # вывод: 50
Результат:
2019 10
2020 20
2021 30
2022 40
2023 50
dtype: int64
30
50
Так можно создать Series из массива NumPy:
import pandas as pd
import numpy as np
data = np.array([10, 20, 30, 40, 50])
series = pd.Series(data)
print(series)
Результат:
0 10
1 20
2 30
3 40
4 50
dtype: int32
А еще Series можно создать с помощью функции range():
import pandas as pd
series = pd.Series(range(1, 6), index=['a', 'b', 'c', 'd', 'e'], name='числа')
print(series)
Результат:
a 1
b 2
c 3
d 4
e 5
Name: числа, dtype: int64
На практике очень часто Series (и DataFrame, как мы увидим позже) создают из данных, представленных в csv файлах. К примеру, есть файл data.csv с таким содержимым:
column_name_1,column_name_2,column_name_3
1,100,Яблоки
2,110,Апельсины
3,130,Мандарины
4,95,Бананы
5,450,Виноград
Из столбцов этого файла можно сформировать Series:
import pandas as pd
dataframe = pd.read_csv('data.csv')
series_1 = dataframe['column_name_1']
series_2 = dataframe['column_name_2']
series_3 = dataframe['column_name_3']
print(series_1)
print(series_2)
print(series_3)
Результат:
0 1
1 2
2 3
3 4
4 5
Name: column_name_1, dtype: int64
0 100
1 110
2 130
3 95
4 450
Name: column_name_2, dtype: int64
0 Яблоки
1 Апельсины
2 Мандарины
3 Бананы
4 Виноград
Name: column_name_3, dtype: object
Способы создания DataFrame
DataFrame можно создавать из одномерных и двумерных списков:
import pandas as pd
data = [['Анна', 25, 'дизайнер'],
['Никита', 30, 'тимлид'],
['Полина', 32, 'бэкендер']]
df = pd.DataFrame(data)
print(df)
Результат:
0 1 2
0 Анна 25 дизайнер
1 Никита 30 тимлид
2 Полина 32 бэкендер
Создание DataFrame из словаря тоже выглядит просто:
import pandas as pd
data = {'Имя': ['Егор', 'Полина', 'Ника'],
'Возраст': [35, 30, 35],
'Город': ['Самара', 'Ростов', 'Омск']}
df = pd.DataFrame(data)
print(df)
Результат:
Имя Возраст Город
0 Егор 35 Самара
1 Полина 30 Ростов
2 Ника 35 Омск
Можно создать DataFrame из NumPy массива:
import pandas as pd
import numpy as np
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
df = pd.DataFrame(data, columns=['А', 'Б', 'В'])
print(df)
Результат:
А Б В
0 1 2 3
1 4 5 6
2 7 8 9
Можно создать DataFrame из одной или нескольких Series – каждая серия станет одним из столбцов:
import pandas as pd
series1 = pd.Series([1, 2, 3], name='XL')
series2 = pd.Series([4, 5, 6], name='M')
df = pd.DataFrame({series1.name: series1, series2.name: series2})
print(df)
Результат:
XL M
0 1 4
1 2 5
2 3 6
Создать DataFrame из csv файла еще проще:
import pandas as pd
df = pd.read_csv('info.csv')
print(df)
Результат:
column1 column2 column3
0 1 30000 Ноутбуки
1 2 5000 Планшеты
2 3 13000 Смартфоны
3 4 4500 Принтеры
4 5 5500 Мониторы
Основные методы Pandas
Библиотека предоставляет множество различных функций для работы с DataFrame и Series – здесь мы рассмотрим только самые основные.
Чтение CSV и XLSX файлов
С помощью методов head() и tail() можно выводить определенное число первых или последних строк файла:
import pandas as pd
# Чтение данных из файла CSV
dataframe = pd.read_csv('data.csv')
# Вывод первых 2 строк DataFrame
print(dataframe.head(2))
# Вывод последних 2 строк DataFrame
print(dataframe.tail(2))
Результат:
столбец_1 столбец_2 столбец_3
0 1 100 Яблоки
1 2 110 Апельсины
столбец_1 столбец_2 столбец_3
6 7 500 Черешня
7 8 250 Персики
Если в head() и tail() не передавать нужное количество строк, по умолчанию будут выведены первые (или последние) 5 строк.
Для чтения Excel файлов используют метод read_excel():
import pandas as pd
# читаем Excel файл
df = pd.read_excel('data.xlsx')
# выводим DataFrame
print(df)
Результат:
SR. NAME GENDER AGE DATE COUNTRY
0 1 Dett Male 18 21/05/2015 Great Britain
1 2 Nern Female 19 15/10/2017 France
2 3 Kallsie Male 20 16/08/2016 France
3 4 Siuau Female 21 21/05/2015 Great Britain
4 5 Shennice Male 22 21/05/2016 France
... ... ... ... ... ... ...
2716 2717 Shennice Female 54 21/05/2024 United States
2717 2718 Chasse Female 55 15/10/2026 United States
2718 2719 Tommye Female 56 16/08/2025 Great Britain
2719 2720 Dorcast Female 57 21/05/2024 France
2720 2721 Angelee Female 58 21/05/2025 Great Britain
[2721 rows x 6 columns]
В read_excel() можно передать дополнительный параметр, чтобы вывести определенный лист по его названию или по индексу:
df = pd.read_excel('data.xlsx', sheet_name='Лист1') # по названию
df = pd.read_excel('data.xlsx', sheet_name=0) # по индексу
Можно прочитать листы выборочно:
sheets = ['Продажи', 'Затраты', 'Прибыль']
df_dict = pd.read_excel('data.xlsx', sheet_name=sheets)
# доступ к объектам DataFrame по именам
df1 = df_dict['Продажи']
df2 = df_dict['Затраты']
df3 = df_dict['Прибыль']
А так можно пропустить нужное количество строк:
df = pd.read_excel('data.xlsx', skiprows=2) # пропускаем первые 2 строки
Запись данных в CSV и XLSX файлы
Метод to_csv() сохраняет DataFrame в csv файле, причем индексы можно не записывать:
import pandas as pd
# создание DataFrame
dataframe = pd.DataFrame({'M': [100, 120, 130], 'L': [140, 150, 165]})
# запись данных в файл CSV
dataframe.to_csv('output.csv', index=False)
Содержимое файла output.csv будет выглядеть так:
M,L
100,140
120,150
130,165
Запись данных в файл Excel выполняют с помощью функции to_excel():
import pandas as pd
# создание DataFrame
dataframe = pd.DataFrame({'Москва': [10000000, 250000, 300], 'Самара': [4000000, 150000, 600]})
# запись данных в файл Excel
dataframe.to_excel('output.xlsx', index=False)
Индексация и доступ к данным
Метод loc[] обеспечивает доступ к данным по метке индекса или столбца:
import pandas as pd
# создаем DataFrame
dataframe = pd.DataFrame({'Велосипеды': [100, 200, 350], 'Самокаты': [240, 500, 650]})
print(dataframe.loc[0, 'Велосипеды']) # выводим значение в первой строке и столбце 'Велосипеды'
print(dataframe.loc[1]) # выводим вторую строку целиком
print(dataframe.loc[:, 'Самокаты']) # выводим столбец 'Самокаты' целиком
Результат:
100
Велосипеды 200
Самокаты 500
Name: 1, dtype: int64
0 240
1 500
2 650
Name: Самокаты, dtype: int64
Метод iloc[] предоставляет доступ к данным по числовому индексу или позиции:
import pandas as pd
# создаем DataFrame
dataframe = pd.DataFrame({'Кошки': [400, 500, 600], 'Собаки': [145, 255, 350]})
print(dataframe.iloc[0, 1]) # выводим значение в первой строке и втором столбце
print(dataframe.iloc[1]) # выводим вторую строку целиком
print(dataframe.iloc[:, 1]) # выводим второй столбец целиком
Результат:
145
Кошки 500
Собаки 255
Name: 1, dtype: int64
0 145
1 255
2 350
Name: Собаки, dtype: int64
Метод at[] обеспечивает доступ к одному элементу по метке индекса и столбца:
import pandas as pd
dataframe = pd.DataFrame({'Фрукты': [150, 250, 350], 'Овощи': [420, 520, 625]})
print(dataframe.at[0, 'Фрукты']) # выводим значение в первой строке и столбце 'Фрукты'
Результат:
150
Метод iat[] предоставляет доступ к одному элементу по числовому индексу и позиции:
import pandas as pd
dataframe = pd.DataFrame({'Возраст': [22, 25, 27], 'Зарплата': [70000, 90000, 12000]})
print(dataframe.iat[0, 1]) # выводим значение в первой строке и втором столбце
Результат:
70000
Манипуляции с данными
shape() возвращает размеры DataFrame:
import pandas as pd
dataframe = pd.DataFrame({'Завтрак': [100, 20, 35], 'Обед': [40, 50, 65], 'Ужин': [20, 150, 75]})
# получаем размеры DataFrame с помощью shape
print(dataframe.shape) # выводим (3, 3) - 3 строки и 3 столбца
Результат:
(3, 3)
drop() позволяет удалять столбцы и строки. Так удаляют столбцы:
import pandas as pd
# создаем DataFrame
dataframe = pd.DataFrame({'А': [1, 2, 3], 'Б': [4, 5, 6], 'В': [4, 5, 6]})
# удаляем столбцы 'A' и 'B'
dataframe_dropped = dataframe.drop(['А', 'В'], axis=1)
print(dataframe_dropped)
Результат:
Б
0 4
1 5
2 6
А так можно удалить строки:
import pandas as pd
dataframe = pd.DataFrame({'А': [10, 20, 30], 'Б': [45, 55, 65], 'В': [74, 85, 96], 'Г': [94, 35, 66]})
# удаляем строки 0 и 1
dataframe_dropped = dataframe.drop([0, 1], axis=0)
print(dataframe_dropped)
Результат:
А Б В Г
2 30 65 96 66
rename() позволяет переименовать столбцы DataFrame:
import pandas as pd
dataframe = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# переименование столбцов 'A' и 'B'
dataframe_renamed = dataframe.rename(columns={'A': 'Столбец_1', 'B': 'Столбец_2'})
print(dataframe_renamed)
Результат:
Столбец_1 Столбец_2
0 1 4
1 2 5
2 3 6
sort_values() выполняет сортировку:
import pandas as pd
dataframe = pd.DataFrame({'А': [3, 2, 1], 'Б': [6, 5, 4], 'В': [9, 8, 7]})
# сортируем данные по столбцу 'A'
dataframe_sorted = dataframe.sort_values(by='А')
print(dataframe_sorted)
Результат:
А Б В
2 1 4 7
1 2 5 8
0 3 6 9
isnull() – возвращает True, если обнаруживает пропуск значения:
import pandas as pd
dataframe = pd.DataFrame({'Углеводы': [43, 27, None, 49],
'Жиры': [50, None, 17, 8],
'Белки': [25, 5, 11, None]})
# ищем пропущенные значения
missing_values = dataframe.isnull()
print(missing_values)
Результат:
Углеводы Жиры Белки
0 False False False
1 False True False
2 True False False
3 False False True
fillna() – заполняет пропущенные значения нужными показателями:
import pandas as pd
dataframe = pd.DataFrame({'Выручка': [105600, 209800, None, 403450],
'Убытки': [5034, None, 17093, 80666],
'Накладные расходы': [15000, None, 17000, 18000]})
# заполняем пропущенные значения нулями
filled_dataframe = dataframe.fillna(0)
print(filled_dataframe)
Результат:
Выручка Убытки Накладные расходы
0 105600.0 5034.0 15000.0
1 209800.0 0.0 0.0
2 0.0 17093.0 17000.0
3 403450.0 80666.0 18000.0
merge() – объединяет DataFrame на основе общих столбцов:
import pandas as pd
dataframe1 = pd.DataFrame({'A': [10, 20, 30, 40],
'B': ['XL', 'L', 'M', 'S']})
dataframe2 = pd.DataFrame({'A': [10, 20, 30, 40],
'C': ['52', '48', '46', '42']})
# объединяем 2 объекта DataFrame на основе столбца 'A'
merged_dataframe = pd.merge(dataframe1, dataframe2, on='A')
print(merged_dataframe)
Результат:
A B C
0 10 XL 52
1 20 L 48
2 30 M 46
3 40 S 42
apply() – применяет функцию к каждому элементу (строке, столбцу):
import pandas as pd
dataframe = pd.DataFrame({'A': [12, 25, 3],
'B': [41, 55, 16]})
# применяем функцию к каждому элементу DataFrame
processed_dataframe = dataframe.apply(lambda x: x ** 2 + 3 * x - 1)
print(processed_dataframe)
# применяем функцию к одному столбцу DataFrame
processed_dataframe['A'] = processed_dataframe['A'].apply(lambda x: x / 5)
print(processed_dataframe)
# применяем функцию ко второй строке
processed_dataframe.loc[1] = processed_dataframe.loc[1].apply(lambda x: x * 10)
print(processed_dataframe)
Результат:
A B
0 179 1803
1 699 3189
2 17 303
A B
0 35.8 1803
1 139.8 3189
2 3.4 303
A B
0 35.8 1803
1 1398.0 31890
2 3.4 303
Статистические показатели
describe() – выводит основные статистические показатели:
import pandas as pd
dataframe = pd.DataFrame({'Лейкоциты': [134, 232, 321], 'Эритроциты': [474, 561, 690]})
# вывод основных статистических показателей
print(dataframe.describe())
Результат:
Лейкоциты Эритроциты
count 3.000000 3.000000
mean 229.000000 575.000000
std 93.536089 108.678425
min 134.000000 474.000000
25% 183.000000 517.500000
50% 232.000000 561.000000
75% 276.500000 625.500000
max 321.000000 690.000000
sum() – суммирует значения по столбцам:
import pandas as pd
dataframe = pd.DataFrame({'Ноутбуки': [341, 267, 382], 'Планшеты': [374, 503, 466]})
# выводим суммы значений по столбцам
print(dataframe.sum())
Результат:
Ноутбуки 990
Планшеты 1343
dtype: int64
mean() – вычисляет средние значения по столбцам:
import pandas as pd
dataframe = pd.DataFrame({'Выручка': [134500, 200670, 300345], 'Затраты': [40450, 50450, 60450]})
# выводим средние значения для столбцов
print(dataframe.mean())
Результат:
Выручка 211838.333333
Затраты 50450.000000
dtype: float64
min() и мах() – выводят минимальные и максимальные значения для каждого столбца:
import pandas as pd
dataframe = pd.DataFrame({'Apple': [1034, 1245, 3985], 'Nvidia': [4034, 5124, 6723]})
print(dataframe.min()) # минимальные значение в столбцах
print(dataframe.max()) # максимальные значения в столбцах
Результат:
Apple 1034
Nvidia 4034
dtype: int64
Apple 3985
Nvidia 6723
dtype: int64
Группировка и агрегация
groupby() – группирует данные по указанному столбцу. Одновременно можно применить к значениям агрегирующую функцию:
import pandas as pd
dataframe = pd.DataFrame({'Имя': ['Анна', 'Кирилл', 'Марина', 'Павел', 'Егор'],
'Возраст': [25, 30, 28, 35, 37],
'Зарплата': [150000, 163000, 145000, 172500, 155000]})
# группируем данные по столбцу 'Имя' и вычисляем среднюю зарплату
grouped_data = dataframe.groupby('Имя').agg({'Зарплата': 'mean'})
print(grouped_data)
Результат:
Зарплата
Имя
Анна 150000.0
Егор 155000.0
Кирилл 163000.0
Марина 145000.0
Павел 172500.0
agg() – применяет агрегирующую функцию к группам данных:
import pandas as pd
dataframe = pd.DataFrame({'Столица': ['Лондон', 'Париж', 'Токио', 'Берлин', 'Рим'],
'Население': [8908081, 2140526, 13929286, 3748148, 2870493],
'Площадь': [1572, 105.4, 2190.93, 891.68, 1285.31],
'Годовая зарплата': [58000, 42000, 72000, 52000, 49000]})
# вычисляем среднее значение и сумму дохода
aggregated_data = dataframe.agg({'Годовая зарплата': ['mean', 'sum']})
print(aggregated_data)
Результат:
Годовая зарплата
mean 54600.0
sum 273000.0
pivot_table() – создает сводную таблицу на основе DataFrame:
import pandas as pd
dataframe = pd.DataFrame({'Производитель': ['Nestle', 'Hershey', 'Mars', 'Ferrero', 'Cadbury'],
'Продукт': ['KitKat', 'Hershey Bar', 'Snickers', 'Ferrero Rocher', 'Dairy Milk'],
'Цена': [2.99, 1.99, 1.49, 14.99, 13.49]})
# создаем сводную таблицу
pivot_table_data = dataframe.pivot_table(index='Производитель', columns='Продукт', values='Цена', aggfunc='mean')
print(pivot_table_data)
Результат:
Продукт Dairy Milk Ferrero Rocher Hershey Bar KitKat Snickers
Производитель
Cadbury 13.49 NaN NaN NaN NaN
Ferrero NaN 14.99 NaN NaN NaN
Hershey NaN NaN 1.99 NaN NaN
Mars NaN NaN NaN NaN 1.49
Nestle NaN NaN NaN 2.99 NaN
Отлично! Вы освоили весь основной арсенал для обработки данных с помощью Pandas.
Вы умеете создавать и изменять DataFrame, выполнять группировку, агрегацию и применять десятки методов для манипуляции данными. У вас в руках полный набор инструментов для подготовки и очистки данных.
Но обработка данных — это лишь полдела. Настоящий анализ начинается тогда, когда вы находите в данных скрытые закономерности и можете наглядно их представить. В полной версии урока вы:
- Научитесь визуализировать данные из DataFrame, строя понятные графики и диаграммы.
- Решите 10 полноценных аналитических мини-проектов: вы будете анализировать финансовые показатели, продажи, климатические данные и многое другое, чтобы ответить на конкретные бизнес-вопросы.
- Соберёте портфолио реальных кейсов, которые демонстрируют ваш навык не просто обрабатывать, а анализировать данные.
Комментарии