Python – DataFrame – Műveletek

In Programozás, Tanulás
Görgess lejjebb

Nézzük meg hogyan tudunk további hasznos műveleteket elvégezni az adott DataFrame esetén, illetve hogyan tudunk szűrni azokon.

Az első esetben arra vagyok kíváncsi, hogy egy adott DataFrame esetén, kijelölve egy oszlopot, abban milyen egyedi értékek szerepelnek? Eredménye a metódusnak egy numpy array lesz.

df['col_2'].unique() --> pontos értékeket adja vissza
df['col_2'].nunique() --> csak számosságában adja vissza

df['col_2'].value_counts() --> Melyik érték mennyiszer

Szintén működik a szűrés is egyben, amelyet az apply metódus miatt is fontos ismét elővenni egy kicsit.

df[df['col_2']>2]

Most képzeljük el, hogy van egy függvényünk, amely a paraméterben kapott érték kétszeresét adja vissza.

def duplazas(x):
   return x * 2

Azt már láttuk, hogy a lenti táblázatban felsorolt beépített függvényeket meg tudjuk hívni például a kijelölt oszlopra (df[‘col_2’].sum()), de mi van akkor, ha olyan függvényre akarjuk meghívni, amelyet mi készítettünk? Itt jön ismétlésként az .apply() függvény.

df['col_2'].apply(duplazas)

Természetesen nem kötelező a függvényt elkészíteni abban az esetben, amennyiben egy egyszerű műveletet szeretnénk használni, hiszen a lambda függvény pont ebben segít.

df['col_2'].apply(lambda x : x * 2)

Hasznos függvények lehetnek még a következők is:

df.columns –> Megmondja a DF-ben található oszlopok neveit

df.index –> Megadja milyen kezdő és vég elemszámunk van, illetve annak lépésközét

Amint kicsit már jobban átlátjuk hogyan boldogulunk el a DataFrame-ek világában, a következő lépcsőhöz érkezünk, amely az adatokon való munkálkodást jelenti. Alap felállásban a parancs a df.oszlopnev.parancs() sémát követi. A következő táblázat tartalmazza a leginkább használt parancsokat:

Nézzük példaként a következőket.
Van egy oszlopunk, amelyekben életkorok vannak. Valamilyen hirtelen felindulásból arra jövünk rá, hogy milyen jó is lenne látni és tudni az életkorok átlagát.

print(customers.age.median())

Számos esetben azonban sokkal jobban érdekelnek minket ezek az adatok egy bizonyos szűkítése mellett az adatok halmazának, így egyéb nagyon értékes megoldásokat használunk azokra.

Ilyen esetekben egy-egy bizonyos oszlopra vetítve csoportosítjuk a sorokat, majd azokon valamilyen számítást végzünk a megoldás segítségével egy másik oszlop értékeit felhasználva.

Tételezzük fel, hogy van egy táblázatunk, benne tanulókkal, tantárgyakkal illetve osztályzatokkal.
Ha például arra vagyunk kíváncsiak, hogy egy adott tanulónak milyen átlag eredménye van, azaz például milyen bizonyítványt érdemel, akkor ahhoz az alábbiak elvégzése szükséges mindösszesen.

osztalyzat = df.groupby("tanulo").osztalyzat.mean()

Általánosságban a következő szintaxist tudjuk használni

df.groupby('oszlop_neve_1').oszlop_neve_2.parancs()

ahol:
– oszlop_neve_1 : amit szeretnénk csoportosítani
– oszlop_neve_2 : amelyen a mérést, számítást végre szeretnénk hajtani
– parancs : az adott számítás

Megint csak FONTOS, hogy ennek eredménye Series lesz. Ahhoz, hogy az eredményünket vissza tudjuk konvertálni DataFrame-(m)é, ahhoz a .reset_index() a mi megoldásunk. Ezzel egyébként azt is elérjük, hogy az egyébként csoportosításra használt oszlopunk egy külön oszlopba kerüljön, és minden sorunk illetve elemünk egy külön indexet kapjon.

Arra is van lehetőségünk, hogy a kapott eredményre rögtön egy szűrést is végezzünk, amennyiben csak bizonyos sor érdekel minket.

stype = df.groupby(shoe_type)
stype.sum().loc['sandals')

A másik hasonló aggregálási függvény a .count(), illetve szintén hasznos a .describe() függvény is, amely sok hasznos információval tér vissza az adott csoportról.

df.groupby(shoe_type).count() --> nem csak számokra végzi el
df.groupby(show_type).max()
df.groupby(show_type).min()

df.groupby(shoe_tpye).describe()

Szintén érdekes lehet az is, hogy az oszlopok átnevezésre kerüljenek, ehhez az alábbiak lehetnek segítségemre jelen esetben:

shoe_type = shoe_type.rename(columns={"Shoes Type": "Counts"})

A következő lépcsőfok ezek után már csak az, amikor olyan eseteket vizsgálunk, ahol nem egyszerű számítások alapján akarunk megjeleníteni valamit, így itt is előkerül a .apply() és lambda hasznossága. Vegyük például azt az egyébként is érdekes esetet, miszerint a 75. százalékot akarjuk vizsgálni (melyik az a pont illetve fizetés, ahol pl. a munkavállalóknak 75%-nak alacsonyabb a fizetése, és melyik az a pont illetve fizetés, ahol a munkavállalók 25%-nak nagyobb a fizetése).

// numpy és percentile miértje, kapcsolata

FONTOS, a lambda függvény listát ad vissza számunkra mint értékek.

magas_fizetesek = employees.groupby("department").wage.apply(lambda x: np.percentile(x, 75)).reset_index()

Mi van akkor, ha nem csak egy oszlop alapján szeretnénk csoportosítani? Semmi akadálya, ezt is megtehetjük a következők szerint:

munkavallalok = employees.groupby(["department", "age"].wage.mean().reset_index()

És akkor utoljára ebben a témakörben, de nem utolsó sorban, mi lenne, ha az eredményeket egy pivot tábla szerűen látnánk, pláne ha már nem csak egy oszlopban gondolkodunk, hanem kettőben 🙂 ? A jó hír, hogy erre is van megoldásunk 🙂

Pandas – Pivot

Akár az excel táblában, itt is megvan a lehetőségünk arra, hogy gyorsan áttekintsük az eredményeinket 2 dimenzióban. Ekkor a már fenti szűrésünk eredményét vetítjük ki egy Pivot-ra a következők szerint:

munkavallalo_pivot = munkavallalo.pivot(
   columns = 'age',
   index = 'department',
   values = 'wage'
).reset_index()

Submit a comment

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.

4 × 4 =