Python Pandas - łączenie / łączenie

Pandas ma w pełni funkcjonalne, wydajne operacje łączenia w pamięci, idiomatycznie bardzo podobne do relacyjnych baz danych, takich jak SQL.

Pandy zapewniają jedną funkcję, merge, jako punkt wejścia dla wszystkich standardowych operacji łączenia bazy danych między obiektami DataFrame -

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)

Tutaj użyliśmy następujących parametrów -

  • left - Obiekt DataFrame.

  • right - Kolejny obiekt DataFrame.

  • on- Kolumny (nazwy) do przyłączenia się. Musi znajdować się zarówno w lewym, jak i prawym obiekcie DataFrame.

  • left_on- Kolumny z lewej ramki DataFrame do użycia jako klucze. Mogą to być nazwy kolumn lub tablice o długości równej długości DataFrame.

  • right_on- Kolumny z prawej ramki DataFrame do użycia jako klucze. Mogą to być nazwy kolumn lub tablice o długości równej długości DataFrame.

  • left_index - Jeśli True,użyj indeksu (etykiet wierszy) z lewej ramki DataFrame jako jego kluczy łączenia. W przypadku ramki DataFrame z MultiIndex (hierarchiczna) liczba poziomów musi odpowiadać liczbie kluczy łączenia z prawej ramki DataFrame.

  • right_index - To samo użycie co left_index dla właściwej ramki DataFrame.

  • how- Jedno z „lewej”, „prawej”, „zewnętrznej”, „wewnętrznej”. Domyślnie wewnętrzna. Każda metoda została opisana poniżej.

  • sort- Sortuj wynik DataFrame według kluczy łączenia w porządku leksykograficznym. Domyślnie True, ustawienie False znacznie poprawi wydajność w wielu przypadkach.

Stwórzmy teraz dwie różne ramki DataFrame i wykonaj na nich operacje scalania.

# 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

Jego output wygląda następująco -

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

Scal dwie ramki danych na kluczu

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')

Jego output wygląda następująco -

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

Scal dwie ramki danych na wielu kluczach

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'])

Jego output wygląda następująco -

Name_x   id   subject_id   Name_y
0    Alice    4         sub6    Bryce
1   Ayoung    5         sub5    Betty

Scal za pomocą argumentu „jak”

Plik howargument do scalenia określa, jak określić, które klucze mają zostać uwzględnione w wynikowej tabeli. Jeśli kombinacja klawiszy nie pojawia się w lewej ani w prawej tabeli, wartości w połączonej tabeli będą miały wartość NA.

Oto podsumowanie how opcje i ich odpowiedniki w SQL -

Metoda scalania Odpowiednik SQL Opis
lewo POŁĄCZENIE LEWE ZEWNĘTRZNE Użyj klawiszy z lewego obiektu
dobrze PRAWE POŁĄCZENIE ZEWNĘTRZNE Użyj kluczy z odpowiedniego obiektu
zewnętrzny PEŁNE POŁĄCZENIE ZEWNĘTRZNE Użyj unii kluczy
wewnętrzny WEWNĘTRZNE DOŁĄCZENIE Użyj przecięcia kluczy

Left Join

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')

Jego output wygląda następująco -

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

Right Join

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')

Jego output wygląda następująco -

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

Połączenie zewnętrzne

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')

Jego output wygląda następująco -

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

Połączenie wewnętrzne

Łączenie nastąpi na indeksie. Operacja Join honoruje obiekt, na którym jest wywoływana. Więc,a.join(b) nie jest równe b.join(a).

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')

Jego output wygląda następująco -

Name_x   id_x   subject_id   Name_y   id_y
0      Amy      2         sub2    Billy      1
1    Allen      3         sub4    Brian      2
2    Alice      4         sub6    Bryce      4
3   Ayoung      5         sub5    Betty      5