W tej lekcji naszego Pandas tutoriala, pokaże Wam jak możemy łączyć ze sobą zbiory. Jeżeli ktoś zna SQL to będzie kojarzyć te operacja jako union i join. Natomiast w Pandas mamy do dyspozycji dwie główne funkcje, nazywające się merge oraz concat. Do dzieła!
Na początku przygotujemy sobie zbiory danych które następnie będziemy łączyć. 2 zbiory które zawierają listę osób oraz ich wiek oraz 1 zbiór który zawiera listę osób oraz ich miejsce zamieszkania.
age = pd.DataFrame({'Name':['Michał', 'Adam', 'Ewa', 'Jakub'], 'Age':[39,28,19,32]})
age2 = pd.DataFrame({'Name':['Mike'], 'Age':[50]})
city = pd.DataFrame({'Name':['Adam', 'Ewa', 'Ola', 'Krystian', 'Jacek'], 'City':['Warszawa', 'Kraków', 'Poznań', 'Zakopane', 'Olsztyn']})
Pandas concat
Na początku połączymy dwa pierwsze zbiory z wiekiem w jeden. Jeden pod drugim. Użyjemy do tego celu funkcji concat. Wystarczy podać listę zbiorów które chcemy połaczyć:
age_new = pd.concat([age, age2])
Wszystko jest dobrze, ale przydała by nam się jeszcze informacja o tym który wiersz pochodzi z którego zbioru. Aby je oznakować możemy użyć parametru keys:
age_new = pd.concat([age, age2], keys=['age', 'age2'])
Pandas merge
W tym momencie mamy 2 zbiory. Jeden age_new z wiekem osób oraz drugi, który nazywa się city, z miejscem ich zamieszkania. Teraz naszym zadaniem jest przypisać do osób wiek oraz miejsce zamieszkania.
Do tego celu, mamy do dyspozycji w Pandas funkcję merge.
Problem jaki się pojawia jest taki, że w obydwu zbiorach tylko część osób jest taka sama. W związku z czym, jak powinien wyglądać nasz wynikowy zbiór danych? Czy powinien zawierać tylko i wyłącznie osoby które występują w obydwu zbiorach, czy może wszystkie osoby, natomiast tam gdzie brakuje informacji o miejscu zamieszkania lub wieku, powinniśmy mieć NaN?
Funkcja merge pozwala nam wybór sposobu łączenia, zobaczmy:
- Merge, inner, czyli tylko część wspólna
Funkcja merge, przyjmuje kilka prostych argumentów. najważniejsze z nich to 'on’, gdzie podajemy klucz po którym chcemy połączyć dane, oraz 'how’ który pozwala na wybór sposobu łączenia. Jeżeli ustawimy how=inner, wtedy będziemy łączyć tylko te dane które znajdują się w obydwu zbiorach:
pd.merge(age_new, city, on='Name', how='inner')
Podaliśmy nasze zbiory danych, ustawiliśmy klucz po którym nastąpiło łączenie zbiorów na 'Name’ oraz sposób łączenia na inner.
- Merge, outer, czyli wszystkie dane
W drugą stronę, jeżeli ustawimy parametr how na outer, to otrzymamy wszystkie dane z obydwu zbiorów. Po prostu brakujące dane będą widoczne jako NaN:
pd.merge(age_new, city, on='Name', how='outer')
- Merge, left, czyli wszystkie dane z lewego zbiory danych
Jeżeli ustawimy parametr how na left, to otrzymamy wszystkie dane z lewego zbioru danych, czyli tego który podamy jako pierwszy do funkcji merge, natomiast brakujące dane z prawego zbioru będą widoczne jako NaN:
pd.merge(age_new, city, on='Name', how='left')
- Merge, right, czyli wszystkie dane z prawego zbiory danych
Jeżeli ustawimy parametr how na right, to otrzymamy wszystkie dane z prawego zbioru danych, czyli tego który podamy jako drugido funkcji merge, natomiast brakujące dane z lewego zbioru będą widoczne jako NaN:
pd.merge(age_new, city, on='Name', how='right')
Podsumowanie Pandas merge i concat
Łączenie zbiorów danych w Pandas jest dość proste. Funkcje merge oraz concat są intuicyjne oraz efektywne. Na pewno jest to milion razy przyjemniejsze niż próba wykonania tych operacji w Excelu.
Spis treści Pandas Tutorial / Kurs
- Pandas – Intro
- Pandas – przygotowanie środowiska pracy
- Pandas – tworzenie prostego DataFrame
- Pandas – odczyt i zapis do pliku
- Pandas – podstawowe informacje o DataFrame
- Pandas – indeksy oraz funkcja loc
- Pandas – maski
- Pandas – modyfikacje kolumn
- Pandas – funkcja apply
- Pandas – typy danych
- Pandas – grupowanie z groupby
- Pandas – unstack oraz tabele przestawne
- Pandas – łączenie zbiorów danych
- Pandas – SQL i bazy danych