Занятие 9
Лабораторное занятие 9¶
Библиотека Pandas¶
Библиотека pandas построена на базе numpy и предоставляет удобный интерфейс для работы с табличными структурами, которые встречаются почти во всех проектах, связанных с анализом, отчётами и машинным обучением. Название библиотеки происходит от эконометрического термина «панельные данные», используемого для описания многомерных структурированных наборов информации.
В библиотеке pandas определены два основных класса объектов для работы с данными:
Series— одномерный массив, способный хранить значения любого типа. По своей структуре напоминает словарь: каждому значению присваивается метка (индекс), которая может быть как числом, так и строкой.DataFrame— двумерная таблица, в которой строки и столбцы имеют имена. Каждый столбец — это объект классаSeries, а сами данные удобно организованы для анализа и преобразований.
Работа с пропусками. Объединение датафреймов.¶
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
Создать Series следующим образом:
s = pd.Series(data, index=index)
data может быть массивом numpy, словарём или скаляром (числом).
index — список меток, по умолчанию это целые числа от 0 до n-1.
s = pd.Series(np.arange(5), index=["a", "b", "c", "d", "e"])
print(s)
s = pd.Series(np.linspace(0, 1, 5))
print(s)
s = pd.Series(np.arange(5), index=["a", "b", "c", "d", "e"])
print(s["a"]) # Один элемент
print(s[["a", "d"]]) # Несколько элементов
print(s[1:]) # Срез
print(s + s) # Поэлементное сложение
Проверка дубликатов и их удаление¶
df = pd.DataFrame({
'A': ['1', '2', '4', '7', '10'],
'B': ['ab', 'c', 'bc', 'ab', 'efd'],
'C': [4, 4, 3.5, 15, 5]})
df
df.drop_duplicates()
Если нужно удалить дубликаты по заданному набору полей, то есть параметр subset, в котором указывается по каким полям удалять дубликаты.
df.drop_duplicates(subset=['B'])
Удаление столбцов и строк. Отсутствующие значения.¶
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, np.nan]})
df
Проверка на NaN-ы:
df.isna()
df.isna().sum()
Удалять строки и столбцы с пустыми значениями можно с помощью функции dropna. Обратите внимание, что применение функции без присваивания создает новый объект, а не меняет df.
df.dropna()
Как и у многих других функций библиотек numpy и pandas есть аргумент axis, который отвечает за выбор: просмотр строк или просмотр столбцов:
df
df.dropna(axis = 0)
df.dropna(axis = 1)
Пропущенные значения можно не только удалить, но и заполнить:
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, np.nan],
[np.nan, 3, np.nan, 4]],
columns=list("ABCD"))
df
Заполнить можно значением:
df.fillna(value=0)
Словарем значений:
values = {"A": 0, "B": 1, "C": 2, "D": 3}
df.fillna(value=values)
Методом заполнения вперед:
df.fillna(method="ffill")
Методом заполенения назад:
df.fillna(method="bfill")
И, конечно, нужно уметь удалять ненужные столбцы. Для этого есть функция drop. Здесь мы уже не обращаем внимание на наличие или отсутствие пустых значений. Параметрами подаются список названий колонок для удаления, и часто указывается axis=1, т.к. по умолчанию считается axis=0, в этом случае поиск будет по индексам строк.
df.drop(["C"], axis = 1)
df.fillna(method="bfill").drop(["A", "C"], axis = 1)
Функция drop также не изменяет исходный объект, а создает новый. Для изменения исходного объекта нужно присвоить ему этот результат:
df = df.fillna(method="bfill").drop(["A", "C"], axis = 1)
df
Еще пара способов:
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, np.nan],
[np.nan, 3, np.nan, 4]],
columns=list("ABCD"))
df
df.mean()
df.fillna(df.mean())
df.fillna(df.min())
df.fillna(df.min()).fillna(df.max().min())
Упражнение 1. Объясните, как работает ячейка выше.
Упражнение 2. Дан датафрейм в ячейке ниже, состоящий из 4 единиц на диагонали и nan-ов. Заполнить его так, чтобы в нем было 8 единиц и 8 двоек. Использовать только fillna.
df = pd.DataFrame([[1, np.nan, np.nan, np.nan],
[np.nan, 1, np.nan, np.nan],
[np.nan, np.nan, 1, np.nan],
[np.nan, np.nan, np.nan, 1]],
columns=list("ABCD"))
df
df[1:2] = df[1:2].fillna(1)
df
Упражнение 3. Из полученного датафрейма удалить столбец (или столбцы) с минимальной суммой значений.
Еще работа с данными. Пассажиры Титаника.¶
df = pd.read_csv(r'train.csv') #поменять путь на актуальный для вас
df.head()
df.columns
df.shape
Объединение датафреймов¶
В pandas для объединения датафреймов есть три метода pd.concat(), merge() и join(). Подробнее о них можно посмотреть: https://newtechaudit.ru/pandas-merge-join-concatenate/
Упражнение 4. Найдите средний возраст пассажиров
Упражнение 5. Выведите имя самого молодого пассажира.
Упражнение 6. Посчитайте доли пассажиров по классам обслуживания (Pclass)
Упражнение 7. Найдите средние возраста пассажиров по классам обслуживания.
Упражнение 8. Удалите столбец с наибольшим числом пропусков.
Упражнение 9. Удалите столбцы с наибольшим числом уникальных значений.
Упражнение 10. Найдите доли выживших среди мужчин, среди женщин и среди всех пассажиров.
Упражнение 11. Найдите доли выживших по классам обслуживания.
Упражнение 12. Найдите доли выживших среди возрастных категорий 18-, 18-60, 60+.
Упражнение 13. Любым из рассмотренных методов реализуйте left join, right join, inner join, outer join датафреймов df1 и df2 (объединение по полю A).
df1 = pd.DataFrame({
'A': ['1', '2', '4', '7', '10'],
'B': ['ab', 'c', 'bc', 'ab', 'efd'],
'C': [4, 4, 3.5, 15, 5]})
df2 = pd.DataFrame({
'A': ['1', '2', '4', '7', '10'],
'F': ['n22', 'c1', 'b8', 'a589', 'b95'],
'D': [100, 400, 30, 150, 50]})