3. diel - Pandas – Základné vlastnosti DataFrames
V minulej lekcii, Pandas - Tvorba vlastného datasetu, sme sa naučili pracovať s knižnicou Pandas a na príkladoch nákupného zoznamu či cvičebného plánu ukázali, ako tvoriť vlastný dataset.
V tomto tutoriále knižnice Pandas v Pythone si
priblížime dátový typ- dtype
. Nadviažeme tým
na minulú lekciu, kde sme sa naučili pracovať s dataframami.
Tieto znalosti si teraz rozšírime s použitím funkcie
info()
. Naučíme sa vyhľadávať v dátach
podľa súradníc a bližšie sa pozrieme na prácu s
riadkami a stĺpcami.
Vlastnosti Pandas
DataFrames()
Pandas DataFrame()
je v podstate 2D tabuľka určená osami
index
a columns
. Ďalšou vlastnosťou je dátový
typ- dtype
. Vráťme sa teraz k nášmu
nákupnému zoznamu. Povedzme, že sme dostali obrovskú chuť na rožok s
maslom a so šunkou. Preto si do dataframu pripíšeme hodnotu True
alebo False
, ktorá určí, či danú potravinu nutne potrebujeme.
Kód vyzerá takto:
shopping_list = [["roll", 10, "pieces", True], ["apple", 8, "pieces", False], ["butter", 1, "pieces", True], ["ham", 200, "grams", True], ["milk", 1, "liters", False], ["egg", 15, "pieces", False] ] df = pd.DataFrame(shopping_list, columns =["Type", "Amount", "", "Necessary"]) df.index += 1 print(df)
Teraz na náš dataframe použijeme funkciu info()
tak, že
nahradíme riadok s funkciou print(df)
. Pomocou info()
si vytiahneme informácie z nášho dataframu:
df.info()
Výstup bude vyzerať takto:
Z tohto výstupu sa môžeme dočítať, že náš index má rozpätie od 1
do 6, čiže obsahuje šesť riadkov. Ďalej tu vidíme, že náš dataframe
obsahuje štyri stĺpce. Z výpisu je tiež zrejmé, koľko hodnôt je
nenulových (tu všetky). Môžeme si pozrieť aj dátové typy stĺpcov.
Keďže Pandas potrebuje, aby každá hodnota zaberala rovnakú pamäť, objavil
sa nám tu dátový typ object
odkazujúci na string
bežných textových hodnôt. Namiesto klasického int
máme
int64
. Číslo za skratkou znamená, koľko bitov zaberá jedna
hodnota. Toto je opäť vytvorené kvôli tomu, aby jednotlivé hodnoty zaberali
rovnakú pamäť. Pre nás je 64 bitov prehnane veľa. Typ je možné
konvertovať na int32
, ktorý nadobúda hodnoty medzi -2147483648 a
2147483647. Ak je pre nás aj toto veľa, môžeme využiť int16
,
ktorý ponúka rozsah medzi -32768 a 32767 alebo aj int8
. Ten
nadobúda hodnoty od -128 do 127. V neposlednom rade máme aj dátový typ
bool
, ktorý ukazuje na hodnoty Áno/Nie.
Vyhľadávanie podľa súradníc
Ako už vieme, Pandas DataFrame je v podstate 2D tabuľka. A rovnako ako
všetky 2D tabuľky má aj Pandas DataFrame súradnice. Zatiaľ čo v geometrii
sú určené osami X a Y av geografii zemepisnou šírkou a dĺžkou, v Pandas
DataFrame sú určené osami index
a columns
. Tieto
súradnice môžeme využiť na vyhľadávanie jednotlivých hodnôt. Povedzme,
že sme zabudli, aké množstvo šunky sme mali kúpiť. Keďže vieme, že
šunka sa nachádza na štvrtom riadku, môžeme jednoducho požadované
množstvo šunky vyhľadať. Vieme, že na osi index
hľadáme
číslo 4 a na osi columns
hľadáme hodnotu Amount
. K
tomu využijeme funkcie df.at[index, column]
:
df.at[4, 'Amount']
Vidíme, že množstvo šunky, ktoré máme kúpiť, je 200.
Samozrejme sa môže stať, že ani nevieme, na ktorom riadku šunka je.
Žiadny problém: využime funkcie df.loc[df[column] == "value"]
.
Pre náš prípad bude kód vyzerať takto:
df.loc[df['Type'] == "ham"]
Po spustení zistíme, že šunka sa v našom dataframe nachádza na 4. riadku. A pretože je náš dataframe malý, môžeme si zo zvyšných hodnôt prečítať rovno aj požadované množstvo:
Základné práce so stĺpcami
Poďme si ďalej rozšíriť obsah nášho nákupného zoznamu. Povedzme, že
sa k nám na návštevu chystá známy alergický na laktózu. Preto potrebujeme
na nákupnom zozname nejako označiť produkty, ktoré obsahujú mlieko. Jednou
z možností je pridať ručne nový stĺpec. To je však pomerne zdĺhavé a
pri práci s väčším objemom dát niekedy priam nemožné. Pridať stĺpec
navyše však nie je žiadny problém vďaka použitiu funkcie
insert()
. Konkrétna syntax je
df.insert(position, column, [values])
. Kód pre pridanie stĺpca do
nášho zoznamu teda bude vyzerať takto:
df.insert(1, "Lactose", [False, False, True, False, True, False])
Pri vyberaní pozície nesmieme zabúdať, že sa opäť počíta od nuly. Pokiaľ chceme dať stĺpec na prvú pozíciu, bude v hodnote pozícii uvedená nula. Pokiaľ chceme pridať náš stĺpec na poslednú pozíciu, uvedieme hodnotu -1. My sme zvolili hodnotu 1, čiže sme umiestnili informáciu o obsahu laktózy na druhú pozíciu medzi stĺpcami. Keď si spustíme náš dataframe, uvidíme, že sa tam skutočne nachádza:
Pokiaľ máme pocit, že sme umiestnenie nezvolili úplne najšťastnejšie,
nie je problém preskladať poradie stĺpcov. K tomu využijeme funkciu
iloc()
. Syntax je jednoduchá -
df.iloc[od index:do index,[order]]
. V našom prípade chceme, aby
prítomnosť laktózy bola na prvom mieste. Náš kód teda bude vyzerať
takto:
df.iloc[:,[1,0,2,3,4]]
V našom kóde sme umiestnili druhý stĺpec pred prvou. Rozsah indexu od:do nebol pre nás v našom malom dataframe nevyhnutný, preto sme ho nevypĺňali. Tabuľka teraz vyzerá takto:
Tu zobrazená tabuľka nie prepísala náš dataframe. Iba sme si vytvorili nový náhľad. Pokiaľ chceme túto tabuľku uložiť ako súčasný dataframe, môžeme tak urobiť jednoducho:
df = df.iloc[:,[1,0,2,3,4]]
Rozmyslíme sa a rozhodneme, že stĺpec s laktózou bol predsa len lepší
na druhom mieste. Poďme ho teda vrátiť späť. Stĺpce nemusíme prehadzovať
nutne len podľa poradia, môžeme využiť aj ich názvy za použitia funkcie
loc()
, ktorú sme už predtým použili na vyhľadávanie
šunky:
df = df.loc[1:6,["Type", "Lactose", "Amount", "", "Necessary"]]
Kód vyzerá v podstate rovnako, ako pri použití funkcie
iloc()
, s výnimkou toho, že sme nahradili poradie stĺpcov ich
názvy. Čísla indexu od/do sme si vyplnili len na ukážku. Všetkých šesť
položiek sa nám opäť uložilo do dataframu.
Tu si tiež môžeme všimnúť, akú potenciálnu neplechu môže vyrobiť
stĺpec, ktorý sme si nijako nepomenovali. Poďme to teda opraviť pomocou
funkcie rename()
. Funkciu použijeme so syntaxou
df.rename(columns={"old name": "new name"})
. V našom prípade
teda:
df = df.rename(columns={"": "Of what"})
Každý stĺpec je teraz popísaný:
Potom, čo náš známy odišiel, je nám už informácia týkajúca sa
laktózy k ničomu. Môžeme teda náš stĺpec odstrániť. To môžeme urobiť
opäť pomocou loc()
. Konkrétne tak, že jednoducho medzi
stĺpcami nezmienime stĺpec "Laktoza". Lepšie riešenie je ale pomocou funkcie
drop()
stĺpec zmazať takto:
df.drop('column', axis=1)
. Axis
, čiže slovensky os,
nadobúda hodnoty 0 pre riadky alebo ako v našom prípade 1 pre stĺpce.
df = df.drop('Lactose', axis=1)
A voilà, stĺpec "Lactose" je preč
Základné práce s riadkami
Keďže už vieme pracovať so stĺpcami, práca s riadkami pre nás nebude
znamenať problém. Do nášho nákupného zoznamu pribudli dva kilogramy
zemiakov. Tie do nášho dataframu pripíšeme za pomoci našej už dobre
známej funkcie loc()
, tentoraz v podobe
df.loc[order] = [values]
. V našom zozname teda do kódu
doplníme:
df.loc[len(df.index)+1] = ['potatoes', 2, "kg", False]
Pridali sme teda nie až také nutné zemiaky na posledné miesto medzi
riadkami. Kód len(df.index)
v našom prípade zastupuje
najvyššie číslo v indexe, čiže posledný riadok, ktorý treba navýšiť o
1:
Ak sa teraz rozhodneme, že je potrebné mať zemiaky na prvom riadku,
môžeme využiť funkciu reindex()
. S jej pomocou si môžeme
zoradiť riadky podľa ich indexu. V našom prípade teda:
df = df.reindex([7,1,2,3,4,5,6])
Výsledkom je, že zemiaky máme na prvom riadku:
Všimnime si, že zemiakom zostalo indexové číslo 7. Ak by sme teraz
chceli resetovať indexové čísla, môžeme tak urobiť pomocou funkcie
reset_index()
:
df = df.reset_index(drop=True)
Parameter drop=True
zaistí, že aktuálny index
bude úplne odstránený a nahradí ho číselný index od nuly.
Ak chceme uchovať číslovanie od jednotky, môžeme tak urobiť
zopakovaním inkrementácie indexu df.index += 1
. Druhou
možnosťou je postarať sa o to pomocou NumPy funkcie
arange()
:
df.index = np.arange(1, len(df) + 1)
Teraz máme náš zoznam upravený. Na prvom mieste sa už nachádzajú zemiaky s indexom 1:
Rovnako, ako pri práci so stĺpcami, môžeme využiť aj funkcie
drop()
. Na zmazanie napríklad posledných vajec použijeme
kód
df = df.drop(7, axis=0)
Jediným rozdielom je, že tentoraz by hodnota axis bola 0 namiesto 1. Zemiaky na našom nákupnom zozname zatiaľ ponechajme.
V budúcej lekcii, Pandas - Podmienené filtrovanie, sa naučíme, akými spôsobmi môžeme v Pandas vykonávať podmienené filtrovanie dát v dataframe.