Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

pandas      79

поля совпадающих строк из датафрейма emps. Однако важно понимать, что во множестве других случаев объединение методом right join — это не то же самое, что объединение inner join. Например, если в датафрейм salary добавить строку, для которой в emps нет совпадений, то объединение right join включит ее наряду со строками, имеющими совпадения в этом датафрейме.

ПРИМЕЧАНИЕ

Подробнее об объединении датафреймов см. в документации pandas1.

УПРАЖНЕНИЕ № 4: ИСПОЛЬЗОВАНИЕ РАЗНЫХ ТИПОВ JOIN

Важно понимать, как различные значения параметра how, переданного в метод join(), влияют на итоговый датафрейм.

Добавьте новую строку к датафрейму salary так, чтобы значение поля Empno для этой строки в датафрейме emps отсутствовало (в предыдущем разделе мы рассмотрели, как добавить строку в датафрейм с помощью объекта Series). После этого объедините датафреймы emps и salary так, чтобы новый датафрейм включал только те строки из emps, которые имеют совпадения в salary. Затем снова объедините emps и salary, но теперь так, чтобы новый датафрейм включал все строки из обоих датафреймов.

Объединение «один-ко-многим»

При объединении методом «один-ко-многим» (one-to-many) строка из одного датафрейма может соответствовать сразу нескольким строкам из другого датафрейма. Рассмотрим ситуацию, когда каждый продавец из датафрейма emps обработал несколько заказов. Это можно отобразить в датафрейме orders:

import pandas as pd

data = [[2608, 9001,35], [2617, 9001,35], [2620, 9001,139], [2621, 9002,95], [2626, 9002,218]]

orders = pd.DataFrame(data, columns = ['Pono', 'Empno', 'Total']) print(orders)

1https://pandas.pydata.org/pandas-docs/stable/reference/frame.html#combining- comparing-joining-merging

80      Глава 3. Библиотеки Python для data science

Так будет выглядеть orders:

 

Pono

Empno

Total

0

2608

9001

35

1

2617

9001

35

2

2620

9001

139

3

2621

9002

95

4

2626

9002

218

 

 

 

 

Теперь, когда у вас есть датафрейм orders с заказами, можно объединить его

сдатафреймом сотрудников, созданным ранее. Это объединение типа «один- ко-многим», поскольку один сотрудник из датафрейма emps может быть связан

снесколькими строками из датафрейма orders:

emps_orders = emps.merge(orders, how='inner', left_on='Empno', right_on='Empno').set_index('Pono')

print(emps_orders)

Вэтом фрагменте кода мы применяем метод merge()для объединения данных из датафреймов emps и orders, имеющих связь «один-ко-многим». Метод merge() позволяет указать столбцы, по которым необходимо проводить объединение, сразу из обоих датафреймов, используя left_on для указания столбца из вызывающего датафрейма и right_on — для столбца из другого датафрейма. При использовании join() можно указать столбец, по которому нужно проводить объединение, только из вызывающего датафрейма. А из другого датафрейма join() берет столбец индексов.

Вэтом примере мы применяем внутренний тип объединения (inner), чтобы включить только связанные строки из обоих датафреймов. В результате получаем следующий датасет:

 

Empno

Name

Job

Total

Pono

 

 

 

 

2608

9001

Jeff Russell

sales

35

2617

9001

Jeff Russell

sales

35

2620

9001

Jeff Russell

sales

139

2621

9002

Jane Boorman

sales

95

2626

9002

Jane Boorman

sales

218

 

 

 

 

 

Рисунок 3.6 иллюстрирует, как работает объединение типа «один-ко-многим».

Как видно на рисунке, объединение «один-ко-многим» включает по одной строке для каждой строки в датасете на стороне ко-многим. Поскольку мы используем тип

pandas      81

объединения inner, никакие другие строки не будут включены. А при объединении типа left или outer в результат будут также включены те строки из датасета на стороне один-, которые не имеют совпадений в датасете на стороне ко-многим.

 

 

emps_orders

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2608

 

9001

Jeff Russell

 

sales

35

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2617

 

9001

Jeff Russell

 

sales

35

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2620

 

9001

Jeff Russell

 

sales

139

 

emps

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9001

Jeff Russell

 

sales

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

orders

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2608

 

9001

 

35

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2617

 

9001

 

35

 

 

 

 

 

 

 

 

 

 

2620

 

9001

 

139

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.6. Объединение двух датафреймов, связанных отношением «один-ко-многим»

Помимо отношений «один-ко-многим» и «один-к-одному», существует связь «многие-ко-многим» (many-to-many). В качестве примера такой взаимосвязи рассмотрим два датасета: в одном будут перечислены книги, а в другом — авторы. Каждая запись в датасете с авторами может быть связана с одной или несколькими записями в датасете с книгами, и наоборот, каждая запись в датасете с книгами может быть связана с одной или несколькими записями из набора данных с авторами. Мы обсудим этот тип отношений в главе 7, где более подробно рассматривается конкатенация, слияние и объединение датасетов.

Агрегирование данных методом groupby()

Метод pandas groupby()позволяет агрегировать данные по нескольким строкам датафрейма. Например, он может найти сумму значений столбца или получить среднее подмножество значений в столбце.

Предположим, что необходимо рассчитать среднюю сумму заказов по каждому сотруднику в датафрейме orders, созданном ранее. Для этого можно воспользоваться методом groupby():

print(orders.groupby(['Empno'])['Total'].mean())