NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Lekce 3 - Pandas – Základní vlastnosti DataFrames

V minulé lekci, Pandas - Tvorba vlastního datasetu, jsme se naučili pracovat s knihovnou Pandas a na příkladech nákupního seznamu či cvičebního plánu ukázali, jak tvořit vlastní dataset.

V tomto tutoriálu knihovny Pandas v Pythonu si přiblížíme datový typ - dtype. Navážeme tím na minulou lekci, kde jsme se naučili pracovat s dataframy. Tyto znalosti si nyní rozšíříme s použitím funkce info(). Naučíme se vyhledávat v datech dle souřadnic a blíže se podíváme na práci s řádky a sloupci.

Vlastnosti Pandas DataFrames()

Pandas DataFrame() je v podstatě 2D tabulka určená osami index a columns. Další vlastností je datový typ - dtype. Vraťme se nyní k našemu nákupnímu seznamu. Řekněme, že jsme dostali obrovskou chuť na rohlík s máslem a se šunkou. Proto si do dataframu připíšeme hodnotu True nebo False, která určí, zda danou potravinu nutně potřebujeme. Kód vypadá takto:

nakup = [["rohlik", 10, "kusu", True],

          ["jablka", 8, "kusu", False],

          ["maslo", 1, "kusu", True],

          ["sunka", 200, "gramu", True],

          ["mleko", 1, "litru", False],

          ["vejce", 15, "kusu", False]
        ]
df = pd.DataFrame(nakup, columns =["Typ", "Mnozstvi", "", "Nutne"])
df.index += 1
print(df)

Nyní na náš dataframe použijeme funkci info() tak, že nahradíme řádek s funkcí print(df). Pomocí info() si vytáhneme informace z našeho dataframu:

df.info()

Výstup bude vypadat takto:

Pandas - Vizualizace dat v Pythonu

Z tohoto výstupu se můžeme dočíst, že náš index má rozpětí od 1 do 6, čili obsahuje šest řádků. Dále zde vidíme, že náš dataframe obsahuje čtyři sloupce. Z výpisu je také zřejmé, kolik hodnot je nenulových (zde všechny). Můžeme si prohlédnout i datové typy sloupců. Jelikož Pandas potřebuje, aby každá hodnota zabírala stejnou paměť, objevil se nám zde datový typ object odkazující na string běžných textových hodnot. Místo klasického int máme int64. Číslo za zkratkou znamená, kolik bitů zabírá jedna hodnota. Toto je opět vytvořeno kvůli tomu, aby jednotlivé hodnoty zabíraly stejnou paměť. Pro nás je 64 bitů přehnaně moc. Typ lze konvertovat na int32, který nabývá hodnot mezi -2147483648 a 2147483647. Pokud je pro nás i toto hodně, můžeme využít int16, který nabízí rozsah mezi -32768 a 32767 nebo i int8. Ten nabývá hodnot od -128 do 127. V neposlední řadě máme také datový typ bool, který ukazuje na hodnoty Ano/Ne.

Vyhledávání dle souřadnic

Jak už víme, Pandas DataFrame je v podstatě 2D tabulka. A stejně jako všechny 2D tabulky má i Pandas DataFrame souřadnice. Zatímco v geometrii jsou určeny osami X a Y a v geografii zeměpisnou šířkou a délkou, v Pandas DataFrame jsou určeny osami index a columns. Tyto souřadnice můžeme využít k vyhledávání jednotlivých hodnot. Řekněme, že jsme zapomněli, jaké množství šunky jsme měli koupit. Jelikož víme, že šunka se nachází na čtvrtém řádku, můžeme jednoduše požadované množství šunky vyhledat. Víme, že na ose index hledáme číslo 4 a na ose columns hledáme hodnotu Mnozstvi. K tomu využijeme funkce df.at[index, column]:

df.at[4, 'Mnozstvi']

Vidíme, že množství šunky, které máme koupit, je 200.

Samozřejmě se může stát, že ani nevíme, na kterém řádku šunka je. Žádný problém: využijme funkce df.loc[df[column] == "hodnota"]. Pro náš případ bude kód vypadat takto:

df.loc[df['Typ'] == "sunka"]

Po spuštění zjistíme, že šunka se v našem dataframu nachází na 4. řádku. A neboť je náš dataframe malý, můžeme si ze zbývajících hodnot přečíst rovnou i požadované množství:

Pandas - Vizualizace dat v Pythonu

Základní práce se sloupci

Pojďme si dále rozšířit obsah našeho nákupního seznamu. Řekněme, že se k nám na návštěvu chystá známý alergický na laktózu. Proto potřebujeme na nákupním seznamu nějak označit produkty, které obsahují mléko. Jednou z možností je přidat ručně nový sloupec. To je ovšem poměrně zdlouhavé a při práci s větším objemem dat někdy přímo nemožné. Přidat sloupec navíc však není žádný problém díky použití funkce insert(). Konkrétní syntaxe je df.insert(pozice, column, [hodnoty]). Kód pro přidání sloupce do našeho seznamu tedy bude vypadat takto:

df.insert(1, "Laktoza", [False, False, True, False, True, False])

Při vybírání pozice nesmíme zapomínat, že se opět počítá od nuly. Pokud chceme dát sloupec na první pozici, bude v hodnotě pozici uvedena nula. Pokud chceme přidat náš sloupec na poslední pozici, uvedeme hodnotu -1. My jsme zvolili hodnotu 1, čili jsme umístili informaci o obsahu laktózy na druhou pozici mezi sloupci. Když si spustíme náš dataframe, uvidíme, že se tam skutečně nachází:

Pandas - Vizualizace dat v Pythonu

Pokud máme pocit, že jsme umístění nezvolili úplně nejšťastněji, není problém přeskládat pořadí sloupců. K tomu využijeme funkce iloc(). Syntaxe je jednoduchá - df.iloc[od index:do index,[pořadí]]. V našem případě chceme, aby přítomnost laktózy byla na prvním místě. Náš kód tedy bude vypadat takto:

df.iloc[:,[1,0,2,3,4]]

V našem kódu jsme umístili druhý sloupec před první. Rozsah indexu od:do nebyl pro nás v našem malém dataframu nezbytný, proto jsme jej nevyplňovali. Tabulka nyní vypadá takto:

Pandas - Vizualizace dat v Pythonu

Zde zobrazená tabulka nepřepsala náš dataframe. Pouze jsme si vytvořili nový náhled. Pokud chceme tuto tabulku uložit jako současný dataframe, můžeme tak učinit jednoduše:

df = df.iloc[:,[1,0,2,3,4]]

Rozmyslíme se a rozhodneme, že sloupec s laktózou byl přece jen lepší na druhém místě. Pojďme jej tedy vrátit zpátky. Sloupce nemusíme prohazovat nutně jen podle pořadí, můžeme využít i jejich názvů za použití funkce loc(), kterou jsme již dříve použili pro vyhledávání šunky:

df = df.loc[1:6,["Typ", "Laktoza", "Mnozstvi", "", "Nutne"]]

Kód vypadá v podstatě stejně, jako při použití funkce iloc(), s výjimkou toho, že jsme nahradili pořadí sloupců jejich názvy. Čísla indexu od/do jsme si vyplnili jen pro ukázku. Všech šest položek se nám opět uložilo do dataframu.

Zde si také můžeme všimnout, jakou potenciální neplechu může vyrobit sloupec, který jsme si nijak nepojmenovali. Pojďme to tedy opravit pomocí funkce rename(). Funkci použijeme se syntaxí df.rename(columns={"starý název": "nový název"}). V našem případě tedy:

df = df.rename(columns={"": "Ceho"})

Každý sloupec je nyní popsaný:

Pandas - Vizualizace dat v Pythonu

Poté, co náš známý odjel, je nám už informace týkající se laktózy k ničemu. Můžeme tedy náš sloupec odstranit. To můžeme udělat opět za pomocí loc(). Konkrétně tak, že jednoduše mezi sloupci nezmíníme sloupec "Laktoza". Lepší řešení je ale za pomocí funkce drop() sloupec smazat takto: df.drop('sloupec', axis=1). Axis, neboli česky osa, nabývá hodnoty 0 pro řádky nebo jako v našem případě 1 pro sloupce.

df = df.drop('Laktoza', axis=1)

A voilà, sloupec "Laktoza" je pryč :-)

Základní práce s řádky

Jelikož už umíme pracovat se sloupci, práce s řádky pro nás nebude znamenat problém. Do našeho nákupního seznamu přibyly dva kilogramy brambor. Ty do našeho dataframu připíšeme za pomocí naší už dobře známé funkce loc(), tentokrát v podobě df.loc[pořadí] = [hodnoty]. V našem seznamu tedy do kódu doplníme:

df.loc[len(df.index)+1] = ['brambory', 2, "kg", False]

Přidali jsme tedy ne až tak nutné brambory na poslední místo mezi řádky. Kód len(df.index) v našem případě zastupuje nejvyšší číslo v indexu, neboli poslední řádek, který je třeba navýšit o 1:

Pandas - Vizualizace dat v Pythonu

Pokud se nyní rozhodneme, že je potřeba mít brambory na prvním řádku, můžeme využít funkce reindex(). S její pomocí si můžeme seřadit řádky podle jejich indexu. V našem případě tedy:

df = df.reindex([7,1,2,3,4,5,6])

Výsledkem je, že brambory máme na prvním řádku:

Pandas - Vizualizace dat v Pythonu

Všimněme si, že bramborám zůstalo indexové číslo 7. Pokud bychom teď chtěli resetovat indexová čísla, můžeme tak udělat pomocí funkce reset_index():

df = df.reset_index(drop=True)

Parametr drop=True zajistí, že aktuální index bude zcela odstraněn a nahradí jej číselný index od nuly.

Pokud chceme uchovat číslování od jedničky, můžeme tak učinit zopakováním inkrementace indexu df.index += 1. Druhou možností je postarat se o to pomocí NumPy funkce arange():

df.index = np.arange(1, len(df) + 1)

Nyní máme náš seznam upravený. Na prvním místě se již nachází brambory s indexem 1:

Pandas - Vizualizace dat v Pythonu

Stejně, jako při práci se sloupci, můžeme také využít funkce drop(). Ke smazání třeba posledních vajec použijeme kód

df = df.drop(7, axis=0)

Jediným rozdílem je, že tentokrát by hodnota axis byla 0 namísto 1. Brambory na našem nákupním seznamu prozatím ponechejme.

V příští lekci, Pandas - Podmíněné filtrování, se naučíme, jakými způsoby můžeme v Pandas provádět podmíněné filtrování dat v dataframe.


 

Předchozí článek
Pandas - Tvorba vlastního datasetu
Všechny články v sekci
Pandas - Vizualizace dat v Pythonu
Přeskočit článek
(nedoporučujeme)
Pandas - Podmíněné filtrování
Článek pro vás napsal Michal Souček
Avatar
Uživatelské hodnocení:
33 hlasů
Michal
Aktivity