Python – DataFrame – Még több tábla

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

Az izgalom valójában akkor indul be, amikor egyre közelebb kerülünk a realitásokhoz, azaz olyan esetekhez amelyek életszerűen is előfordulnak. Valljuk be magunknak azt, hogy egy tábla használata ezt nem mindig elégíti ki, sokkal reálisabb hogy több táblában tárolódnak az értékek.

Amikor több táblában is tárolunk adatokat, és előfordulhat olyan, hogy az egyes táblák adatainak önmagában semmilyen értelme nincsen, akkor kezd beindulni minden. Például ha van egy megrendelés táblázatunk, ahol csak megrendelő azonosítókat és megrendelt termék azonosítókat tárolunk, akkor abból nehezen derítjük ki, hogy a 3-as számú ügyfelünk által rendelt 27-es termék pontosan mi is. Ehhez végig kell követni az egyes táblázatokat illetve azok adatait, hogy a választ erre megkapjuk, ezt hívjuk merging -nek, azaz összeolvadásnak (kb.).

A .merge metódus a közös oszlopokat keresi a paraméterben megadott táblákban, majd ezek után egy új táblában a különböző sorokat ötvözi.

uj_dataFrame = pd.merge(orders, costumers)

Szerencsére minden DataFrame-nek van merge metódusa, így ha több táblát is össze akarunk olvasztani, akkor ezeket tudjuk láncolatban használni.

new_df = orders.merge(customers).merge(products)

A különböző oszlopok értékeinek szűrése jelen esetben sem változik, azaz az összeolvasztás után sem. Pl. szűrni azt, hogy melyik oszlopban nagyobb a bevétel mint a cél a már megszokott módon tudjuk:

eredmeny = pd[pd.bevetel > pd.terv]

Ez mind szép és jó, na de ha már életszerű dolgoknál tartottunk, akkor nem normálisabb az, hogy pl az id oszlop minden táblában benne van? Na és ha így van, akkor vajon ez hogyan érinti az összeolvadásunkat? Bizony nem túl jól, ezért ezt meg kell oldanunk előtte. Az egyik megoldás az, ha átnevezzük az egyik tábla id oszlopát

orders_products = pd.merge(orders, products.rename(columns={'id':'product_id'}))

És még innen is van tovább. Ugyanis mi lenne akkor, ha átnevezés nélkül is menne ez? Márpedig megy, ehhez a left_on és right_on kulcsokat kell használni, illetve a suffixes-t. Ezzel azt érjük el, hogy lényegében meg tudjuk mondani, hogy a két táblában mely oszlopokat kell összekapcsolnunk ahhoz, hogy az értékek összerendelhetők legyenek egymással. Az első tábla amit megadunk a bal, majd követi a jobb tábla.

pd.merge(
   orders,
   products,
   left_on='customer_id',
   right_on='id',
   suffixes=['_order', 'products']
)

Az eredménye pedig

Hiányzó értékek – Inner merge

Mi van akkor, ha két tábla összekapcsolása esetén az egyikben olyan hivatkozás van, amely valamiért a másikban nem található meg? Pl egyik ügyfelünk megrendeli az 5-ös terméket, de a termékek táblában elfelejtettük felvenni az 5-ös terméket. Ebben az esetben az történik a merge során, hogy az adott sor egyszerűen kimarad. Ezt hívjuk inner merge-nek.

Hiányzó értékek – Outer merge

Van arra is lehetőség, hogy ezeket a sorokat megtartsuk, ám az adott sorban egy nan jelzővel jelezzük, hogy nem volt érték az adott sor oszlop találkozásánál.

store_a_b_outer = pd.merge(store_a, store_b, how='outer')

Ha nem akarjuk a két tábla értékeit egyben látni, azaz pl. csak arra vagyunk kíváncsiak, hogy az A bolt készletét vizsgáljuk B bolt készleteire (azaz nem lesz benne az a termék, amely csak B-nél kapható, de A-nál nem), akkor ún. left merge a keresett megoldásunk.

store_a_b_left = pd.merge(store_a, store_b, how="left")

Több hasonló tábla összefűzése

Ha az adatok, amelyek azonosak, több táblában vannak tárolva, akkor azok beolvasása egy közös táblába is megtörténhet, így az elemzés könnyebben elvégezhető.

pd.concat([df1, df2])

Ekkor viszik magukkal az azonosítójukat szépen, így az összefűzés után a reset_index() sokat segíthet új indexelés tekintetében.

Null értékek kigyűjtése

Végre sikerült összehoznom azt, hogy szépen kiszedjem a null értékeket a táblából (vagy akár számolhattam volna is azokat, mindegy). Eddig találtam pár megoldást, ám azok nem hoztak nagy örömöt nekem, de most a klasszikus megoldással “mentem”.

null_cart = cart_checkout[cart_checkout.checkout_time.isnull()]

#A megoldás, ami nem vezetett eredményre valamiért, és a neten keringett
null_ertekek = cart.columns[cart.isnull().any()]

Submit a comment

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

12 − 8 =