Python Pandas — Слияние / Присоединение

Поділитись

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

Pandas предоставляет единственную функцию merge в качестве точки входа для всех стандартных операций соединения базы данных между объектами DataFrame —

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
Здесь мы использовали следующие параметры —

слева — объект DataFrame.

справа — еще один объект DataFrame.

on — столбцы (имена) для присоединения. Должен быть найден как в левом, так и в правом объектах DataFrame.

left_on — столбцы из левого DataFrame для использования в качестве ключей. Это могут быть имена столбцов или массивы, длина которых равна длине DataFrame.

right_on — столбцы справа DataFrame для использования в качестве ключей. Это могут быть имена столбцов или массивы, длина которых равна длине DataFrame.

left_index — если True, используйте индекс (метки строк) из левого DataFrame в качестве его ключей присоединения. В случае DataFrame с MultiIndex (иерархическим) количество уровней должно соответствовать количеству ключей объединения из правого DataFrame.

right_index — такое же использование, как left_index для правого фрейма данных.

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

sort — сортирует результирующий DataFrame по ключам соединения в лексикографическом порядке. По умолчанию установлено значение True, во многих случаях значительно улучшена производительность.

слева — объект DataFrame.

справа — еще один объект DataFrame.

on — столбцы (имена) для присоединения. Должен быть найден как в левом, так и в правом объектах DataFrame.

left_on — столбцы из левого DataFrame для использования в качестве ключей. Это могут быть имена столбцов или массивы, длина которых равна длине DataFrame.

right_on — столбцы справа DataFrame для использования в качестве ключей. Это могут быть имена столбцов или массивы, длина которых равна длине DataFrame.

left_index — если True, используйте индекс (метки строк) из левого DataFrame в качестве его ключей присоединения. В случае DataFrame с MultiIndex (иерархическим) количество уровней должно соответствовать количеству ключей объединения из правого DataFrame.

right_index — такое же использование, как left_index для правого фрейма данных.

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

sort — сортирует результирующий DataFrame по ключам соединения в лексикографическом порядке. По умолчанию установлено значение True, во многих случаях значительно улучшена производительность.

Давайте теперь создадим два разных DataFrames и выполним операции слияния с ним.

Data Scientist: машинное обучение
 Live Demo

# import the pandas library
import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
   {'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right
Его вывод выглядит следующим образом —

    Name  id   subject_id
0   Alex   1         sub1
1    Amy   2         sub2
2  Allen   3         sub4
3  Alice   4         sub6
4  Ayoung  5         sub5

    Name  id   subject_id
0  Billy   1         sub2
1  Brian   2         sub4
2  Bran    3         sub3
3  Bryce   4         sub6
4  Betty   5         sub5
Объединить два фрейма данных на ключе
 Live Demo

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')
Его вывод выглядит следующим образом —

   Name_x   id  subject_id_x   Name_y   subject_id_y
0  Alex      1          sub1    Billy           sub2
1  Amy       2          sub2    Brian           sub4
2  Allen     3          sub4     Bran           sub3
3  Alice     4          sub6    Bryce           sub6
4  Ayoung    5          sub5    Betty           sub5
Объединение двух фреймов данных на нескольких ключах
 Live Demo

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
	'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])
Его вывод выглядит следующим образом —

    Name_x   id   subject_id   Name_y
0    Alice    4         sub6    Bryce
1   Ayoung    5         sub5    Betty
Слияние с помощью аргумента «как»
Аргумент how для слияния определяет, как определить, какие ключи должны быть включены в итоговую таблицу. Если комбинация клавиш не отображается ни в левой, ни в правой таблицах, значения в объединенной таблице будут равны NA.

Вот краткое изложение того, как параметры и их эквивалентные имена SQL —

Метод слияния	SQL-эквивалент	Описание
оставил	ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ	Используйте ключи от левого объекта
право	ПРАВО НАРУЖНОЕ СОЕДИНЕНИЕ	Используйте ключи от правильного объекта
внешний	ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ	Используйте объединение ключей
внутренний	ВНУТРЕННЕЕ СОЕДИНЕНИЕ	Используйте пересечение ключей
Оставить Присоединиться
 Live Demo

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')
Его вывод выглядит следующим образом —

    Name_x   id_x   subject_id   Name_y   id_y
0     Alex      1         sub1      NaN    NaN
1      Amy      2         sub2    Billy    1.0
2    Allen      3         sub4    Brian    2.0
3    Alice      4         sub6    Bryce    4.0
4   Ayoung      5         sub5    Betty    5.0
Право Присоединиться
 Live Demo

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')
Его вывод выглядит следующим образом —

    Name_x  id_x   subject_id   Name_y   id_y
0      Amy   2.0         sub2    Billy      1
1    Allen   3.0         sub4    Brian      2
2    Alice   4.0         sub6    Bryce      4
3   Ayoung   5.0         sub5    Betty      5
4      NaN   NaN         sub3     Bran      3
Внешнее соединение
 Live Demo

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')
Его вывод выглядит следующим образом —

    Name_x  id_x   subject_id   Name_y   id_y
0     Alex   1.0         sub1      NaN    NaN
1      Amy   2.0         sub2    Billy    1.0
2    Allen   3.0         sub4    Brian    2.0
3    Alice   4.0         sub6    Bryce    4.0
4   Ayoung   5.0         sub5    Betty    5.0
5      NaN   NaN         sub3     Bran    3.0
Внутреннее соединение
Присоединение будет осуществляться по указателю. Операция Join учитывает объект, для которого она вызывается. Таким образом, a.join (b) не равен b.join (a) .

 Live Demo

import pandas as pd
left = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
   'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
   'id':[1,2,3,4,5],
   'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
   'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')

Поділитись