11. diel - Pandas - Kombinovanie DataFrames
V predchádzajúcej lekcii, Pandas - Matematické a štatistické metódy, sme si ukázali niektoré matematické metódy a štatistické metódy.
V tejto lekcii knižnice Pandas v Pythone sa zameriame na
metódy, ktoré nám pomáhajú efektívne kombinovať
DataFrames. Ukážeme si metódy ako concat(),
merge(), join() alebo update().
Kombinovanie DataFramov v Pandas
Než si predstavíme dnešnú tému, poďme si najskôr importovať testovacie dáta.
Import dát
Použijeme dataset s úbytkom zamestnancov v zdravotníckom sektore v USA, ktorý je dostupný v prílohe na konci lekcie.
Naimportujeme si dáta:
import pandas as pd df = pd.read_csv('healthcare.csv') df
Výsledok importu dát je nasledujúci:

Metódy
Kombinovanie dát je kľúčovou súčasťou analýzy, najmä ak pracujeme s rôznymi zdrojmi dát alebo potrebujeme obohatiť existujúci dataset o ďalšie informácie. Ukážeme si metódy, ktoré nám kombinovanie týchto dát umožňujú.
concat()
Metóda concat() umožňuje spojiť niekoľko dataframov
pozdĺž riadkov alebo stĺpcov. Spájanie
prebieha bez ohľadu na spoločné kľúče alebo indexy.
Vyberieme si zamestnancov z dvoch oddelení - Cardiology a
Neurology:
cardiology = df[df['Department'] == 'Cardiology'] neurology = df[df['Department'] == 'Neurology']
Tieto dva dataframy teraz spojíme dohromady:
joined_df = pd.concat([cardiology, neurology]) joined_df
Vznikol nám dataframe so zamestnancami z oboch oddelení:

merge()
Pomocou metódy merge() zlúčime dva dataframy na základe
spoločných stĺpcov alebo indexov. Možnosti
pre spájanie dát určuje parameter how.
Parameter how
Parameter how prijíma niekoľko hodnôt:
left– Zachová všetky riadky z ľavého dataframu a zodpovedajúce riadky z pravého dataframu. Ak nie je nájdená zhoda, vyplní hodnotouNaN.right– Zachová všetky riadky z pravého dataframu a zodpovedajúce riadky z ľavého dataframu. Ak nie je nájdená zhoda, vyplní hodnotouNaN.inner– Zachová iba riadky so zodpovedajúcimi hodnotami v oboch dataframoch. Riadky bez zhody sú vyradené.outer– Zachová všetky riadky z oboch dataframov. Riadky bez zodpovedajúcej hodnoty v druhom dataframe sú vyplnené hodnotouNaN.
Tvorba nového DataFrame
Vyskúšame si teraz prácu s merge(). Najprv si vytvoríme
nový dataframe, ktorý bude obsahovať iba
EmployeeID a nový stĺpec PreferredTransport:
transport = {
'EmployeeID': [1414939, 1200302, 1060315, 1812428, 1313919],
'PreferredTransport': ['Car', 'Bike', 'Public Transport', 'Walk', 'Car']
}
df_transport = pd.DataFrame(transport)
Stĺpec EmployeeID bude slúžiť ako spojenie medzi
dvoma dataframami. Vytvorili sme päť záznamov s hodnotami
EmployeeID reálnych zamestnancov z nášho datasetu. V stĺpci
PreferredTransport sa bude nachádzať preferovaný spôsob dopravy
do práce.
Teraz si tento nový dataframe zobrazíme:
df_transport
Po spustení kódu vidíme:

Hodnota left v parametri
how
Metódu merge() si teraz vyskúšame s vložením hodnoty
left do parametra how:
merged_df = pd.merge(df, df_transport, on='EmployeeID', how='left') merged_df[['EmployeeID', 'PreferredTransport', 'Age']]
Výstupom bude opäť nový dataframe, ktorý však obsahuje spojenie dvoch
dataframov - df a df_transport. Pri využití
merge() sme postupne v parametroch on a
how odovzdali oba dataframy.
Parameter on určuje stĺpec na ktorom oba
dataframy prepájame a parameter how spôsob, akým prepájame.
Zobrazené dáta teraz vyzerajú takto:

Všimnime si, že nie všetky hodnoty sa vyplnili. Dôvodom je, že sme
použili spôsob prepojenia left. Použili sa tak dáta z dataframu
df a zhoda sa nenašla všade, preto má väčšina dát hodnotu
NaN.
Hodnota inner v parametri
how
Vyskúšajme si teraz to isté, ale s využitím hodnoty inner.
Zmeňme si ešte názov premennej dataframe na merged_df_inner (ten
pôvodný budeme ešte potrebovať):
merged_df_inner = pd.merge(df, df_transport, on='EmployeeID', how='inner') merged_df_inner[['EmployeeID', 'PreferredTransport', 'Age']]
Teraz dostaneme iba zamestnancov, kde sa podarilo prepojenie:

join()
Metóda join() nám umožní spojiť dva dataframy
podľa indexov. Je všeobecne jednoduchšia na použitie ako
merge() a vhodná, ak chceme pridať ďalšie stĺpce na základe
zhodných indexov.
Pripojme si informácie o firemnom členstve zamestnancov v klube zdravia.
Klub zdravia bude charakterizovaný stĺpcom HealthClubMembership,
ktorý bude uložený v samostatnom dataframe:
health_club_data = {
'HealthClubMembership': ['Yes', 'No', 'Yes', 'No', 'Yes']
}
df_health_club = pd.DataFrame(health_club_data).set_index(neurology.index[:5])
Dataframu df_health_club sme nastavili správne
indexy využitím metódy set_index(). Indexy sme vybrali
ako prvých päť indexov z dataframu neurology.
Následne pomocou metódy join() vytvoríme nový dataframe
prepojený s dataframom neurology:
joined_df = neurology.join(df_health_club) joined_df[['EmployeeID','Age','HealthClubMembership','Department']].head(7)
Výstupom bude prvých sedem zamestnancov z oddelenia neurology
spoločne s informáciou, či sú v klube zdraví alebo nie:

Nenájdený index sa opäť vyplní hodnotou
NaN.
combine_first()
Metóda combine_first() sa používa na doplnenie
chýbajúcich hodnôt v jednom dataframe hodnotami z iného
dataframu. Pri použití sa zachová štruktúra prvého dataframu, ale
kombinujú sa dostupné informácie z oboch dataframov.
Vyskúšame si teraz metódu combine_first() na doplnenie
niekoľkých hodnôt, ktoré sme nevyplnili pri použití merge() v
stĺpci PreferredTransport. Zobrazíme si najskôr znovu tento
dataframe:
merged_df[['EmployeeID', 'PreferredTransport', 'Age']].head(10)
Dostaneme tento výstup:

Zobrazili sme si prvých desať riadkov. Vidíme, že niektoré riadky majú
hodnotu NaN. Tento problém teraz vyriešime.
Najprv si pripravíme dáta a z nich vytvoríme dataframe:
transport = {
'PreferredTransport': [None, None, None, 'Public Transport', None, 'Car','Bus','Plane','Walk','Bike']
}
df_transport = pd.DataFrame(transport)
Následne dataframu merged_df nastavíme pre stĺpec
PreferredTransport hodnoty z dataframu df_transport
využitím metódy combine_first a zobrazíme prvých desať
riadkov:
merged_df['PreferredTransport'] = merged_df['PreferredTransport'].combine_first(df_transport['PreferredTransport']) merged_df[['EmployeeID', 'PreferredTransport', 'Age']].head(10)
Vo výsledku teda dostaneme náš pôvodný dataframe merged_df
rozšírený o nové hodnoty, ktoré boli doplnené podľa indexu:

V našich dátach transport sme nastavili niektoré
hodnoty PreferredTransport na None. Všimnime si, že
táto zmena neprebehla, pretože metóda combine_first() doplní
iba prázdne hodnoty.
update()
Pomocou metódy update() môžeme aktualizovať
hodnoty v jednom dataframe na základe iného dataframu. Poďme si to
vyskúšať a aktualizovať mesačné platy a vek pre zamestnancov z oddelenia
Cardiology. Najprv sa pozrime, ako vyzerá prvých päť
zamestnancov:
cardiology[['Age','MonthlyIncome']].head()
Výsledok:

Teraz upravíme zamestnancov na indexoch 0 a 29.
Pripravíme si dáta a vytvoríme z nich dataframe:
updated_data = {
'Age': [42,47],
'MonthlyIncome': [6050, 19000]
}
updated_df = pd.DataFrame(updated_data, index=[0, 29])
Museli sme správne nastaviť indexy, pretože podľa nich bude
update() prebiehať.
Nakoniec zavoláme metódu update() a zobrazíme opäť
dáta:
cardiology.update(updated_df) cardiology[['Age','MonthlyIncome']].head()
Výsledkom bude zostarnutie dvoch zamestnancov a zvýšenie ich platu:

V nasledujúcej lekcii, Pandas - Spracovanie chýbajúcich hodnôt, si ukážeme užitočné metódy na spracovanie chýbajúcich hodnôt v dátach.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 5x (59.22 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

