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