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:
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í:
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í:
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:
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ý:
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:
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:
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:
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.