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 lekci Tvorba vlastního
datasetu, 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']
Pokud nevíme, na kterém řádku šunka je, 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í:

Vidíme, že množství šunky, které máme koupit, je
200
.
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í funkce 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.