Čtení na doma: Funkce pivot
Začneme tím, že si načteme data ze souboru food_nutrient.csv
do tabulky food_nutrient
.
import pandas as pd
food_nutrient = pd.read_csv("food_nutrient.csv")
Pokračujme nyní funkce pivot()
. Tato funkce slouží k "přeskládání" tabulky. Výsledná tabulka nebude mít samostatný řádek pro každou kombinaci potraviny a výživné látky. Tabulku přeskládáme tak, aby každá potravina měla pouze jeden řádek a jednotlivé výživné látky budou uloženy ve sloupcích. Namísto sloupce name
s názvem výživné látky budeme mít názvy výživných látek přímo ve sloupcích.
Funkci pivot
určíme čtyři parametry, kromě prvního parametru data
musíme všechny psát jako pojmenované:
- Prvním parametrem (
data
) určujeme tabulku, se kterou bude funkce pracovat. - Parametr
index
slouží jako popisek řádků. V našem případě zvolíme sloupečekfdc_id
, tj. unikátní číslo potraviny. - Parametr
columns
bude použit k vytvoření nových sloupečků. Každá unikátní hodnota v tomto sloupci bude znamenat nový sloupeček ve výsledné tabulce. Sem doplníme sloupecname
. - Parametr
value
označuje sloupec, ze kterého budou čteny hodnoty. V našem případě půjde o sloupecamount
. Funkcepivot
se pro každý řádek původní tabulky "podívá" na sloupcefdc_id
aname
, tj. na číslo potraviny a název výživné látky. Hodnotu, která je ve sloupciamount
, pak doplní do nové tabulky na řádek se stejnýmfdc_id
a do sloupce pro příslušnou výživnou látku.
Pozor na to, že kombinace každé dvojice sloupců index
a columns
může být v původní tabulce pouze jednou, jinak by totiž nebylo možné data "přeskládat" - do jednoho políčka tabulky bychom museli nacpat více než jednu hodnotu. Funkce na takovou situaci reaguje chybou. Pokud máme v tabulce malé množství duplicitních hodnot, můžeme je odstranit s využitím metody drop_duplicates()
. Použijeme metodu pro naše data. Využijeme parametr subset
a do něj vložíme názvy sloupců, podle kterých má být duplicita rozpoznána.
food_nutrient = food_nutrient.drop_duplicates(subset=["fdc_id", "name"])
U funkce pivot()
je důležité, abychom pro každou kombinaci fdc_id
a name
měli pouze jeden řádek. Funkce totiž neprovádí žádnou agregaci. Pokud bychom agregaci potřebovali provést, musíme použít některou z funkcí, které si ukážeme dále.
Níže je použití funkce pivot
.
food_nutrient_pivot = pd.pivot(food_nutrient, index="fdc_id", columns="name", values="amount")
K tabulce food_nutrient_pivot
můžeme připojit další informace o potravinách, se kterými jsme pracovali v předchozích lekcích. Budeme tedy vědět, kterých potravin se každý řádek týká.
branded_food = pd.read_csv("branded_food.csv")
food = pd.concat([pd.read_csv("food_sample_100.csv"), pd.read_csv("food_other.csv")], ignore_index=True)
food_brands = pd.merge(food, branded_food, on="fdc_id")
food_nutrient_pivot = pd.merge(food_nutrient_pivot, food_brands, on="fdc_id")
Po úpravě dat s využitím funkce pivot()
můžeme snadno vytvořit další typ grafu, a to je scatter plotbodový graf. Bodový graf bude mít na svislé i vodorovné ose množství některé z výživných látek. Pomocí bodového grafu uvidíme, jestli může být mezi množstvím výživných látek nějaká souvislost. Vraťme se opět k výzkumu o kardiovaskulárním systému. Pro něj mohou být škodlivé nasycené kyseliny a cholesterol. Pomocí bodového grafu se můžeme podívat, jestli mají sýry s větším množstvím nasycených kyselin i větší množství cholesterolu. Graf doplníme popiskem, musíme pro něj využít mírně odlišnou syntaxi.
import seaborn as sns
cheese = food_nutrient_pivot[food_nutrient_pivot["branded_food_category"] == "Cheese"]
g = sns.JointGrid(cheese, x="Fatty acids, total saturated", y="Cholesterol")
g.plot_joint(sns.scatterplot)
g.fig.suptitle("Porovnání množství výživných látek v sýrech")
g.ax_joint.set_xlabel("Nasycené kyseliny")
g.ax_joint.set_ylabel("Cholesterol")
Výsledný graf je na obrázku níže.