import pandas as pd # szokásos import
Az alábbiakban az elmúlt pár év érettségi statisztikai adatait fogjuk megvizsgálni. Ez a példa sok szempontból jól illusztrál olyan problémákat, amelyek valós adatbázis-elemzések kapcsán felmerülhetnek. Ilyen például a hiányzó adatok kezelése, vagy a nem egészen kompatibilis adatbázisok egységes kezelése. Az érettségi adatokat tartalmazó honlap az előzőekben megismert elválasztóval tagolt tagolt csv formátumban teszi elérhetővé, itt az elválasztójel a pontosvessző.
df=pd.read_csv("data/erettsegi.csv.gz",sep=";",index_col=0)
df.head()
Látható, hogy az év
, szint
megadják, hogy melyik évben, melyik szintű érettségiről van szó. Azt is megállapíthatjuk, hogy ősszel vagy tavasszal (időszak
) írta-e a diák az érettségit, az iskolájáról és a képzési típusról is rögzítve van a statisztika. Emellett részletes írásbeli és szóbeli, illetve összpontszám, összesített százalék is szerepel az adatok között.
Érdemes az első néhány sort kiíratni példaként, hogy lássuk, mivel is van dolgunk. Most transzponálva írjuk ki, hogy elférjen a képernyőre.
df.head().T
Csináljunk először egy kisebb táblázatot, hogy jól átlássuk.
subdf=df[['vizsga szintje','vizsgázó képzési típusa','írásbeli pontszám']]
subdf.head()
Egy oszlop értékei szerint csoportosíthatjuk a DataFrame-et, és utána a csoportokon végezhetünk műveleteket.
g=subdf.groupby('vizsga szintje')
g
Vegyük a csoportok maximumát!
g.max()
Átlagát (figyeljük meg, hogy a numerikus oszlopra csinálta csak meg)!
g.mean()
Kiválaszthatunk egy oszlopot.
g['írásbeli pontszám'].mean()
Ha két szögletes zárójellel választjuk ki, akkor egy oszlopra nem Series, hanem DataFrame lesz az eredmény, és szebben formázódik.
g[['írásbeli pontszám']].mean()
Egyszerre két oszlop szerint is csoportosíthatunk, ilyenkor listát kell a groupby
-nak átadnunk. Itt már nem csak az Emelt
oszlop, hanem a Nem
oszlop is a táblázat indexének a része, ezt hívjuk többszintű indexelésnek.
g=subdf.groupby(['vizsga szintje','vizsgázó képzési típusa'])
g.mean()
Eltekinthetünk attól, hogy a csoportok indexként jelenjenek meg, és oszlopot is kaphatunk belőlük.
g=subdf.groupby(['vizsga szintje','vizsgázó képzési típusa']
,as_index=False)
g.mean()
A hierarchikusan indexelt táblázatot az unstack függvénnyel átrendezhetjük, ha úgy használhatóbb.
g=subdf.groupby(['vizsga szintje','vizsgázó képzési típusa'])
g.mean().unstack(level=0)
g.mean().unstack(level=1)
Ehhez először kiválasztjuk az emelt szintű érettségit tartalmazó sorokat,
emelt=df[df["szint"]=="E"]
Azokat év szerint csoportosítjuk.
group=emelt.groupby("év")
Kiválasztjuk az "érdemjegy" oszlopot, amit a végén átlagolunk. A csoportosítás miatt az átlag évenként kerül kiszámításra.
group[["érdemjegy"]].mean()
Egyben:
df[df["szint"]=="E"].groupby("év")[["érdemjegy"]].mean()
Először logikai indexeléssel kiválasztjuk a 2015-ös középszintű érettségiket tartalmazó sorokat. Több feltételt a sorokra egyszerre az and
operátor helyett az & operátorral adhatunk meg, és a feltételeket zárójeleznünk kell, hogy jól olvassa az értelmező.
Ezek után csoportosítunk a vizsgázó neme szerint, majd vesszük az összpontszámok átlagát.
k_2015=df[(df["szint"]=="K") & (df["év"]==2015)]
k_2015.groupby("vizsgázó neme")[["össz pontszám"]].mean()
Most egyszerre két oszlop szerint is csoportosítottunk, a csoportosítás alapját képező oszlopok nevét listaként kell megadni a groupby-nak. Utána egy tetszőleges oszlopot (pl. év) kiválasztva megszámláltathatjuk csoportonként a sorokat a count-tal.
df.groupby(["vizsgázó képzési típusa",
"vizsgázó részvétele"])[["év"]].count()