|
| 1 | +## Převody dat na DataFrame a zpět |
| 2 | + |
| 3 | +`DataFrame` nejsou uzavřeným světem, ale umožňují snadný převod na seznamy, případně můžeme naopak převést seznam na `DataFrame`. |
| 4 | + |
| 5 | +### Převod DataFrame na seznam |
| 6 | + |
| 7 | +K takovému převodu na seznam nám poslouží kombinace funkcí `to_numpy` a `tolist`. Převod totiž neprovádíme přímo, ale jako mezikrok jej převedeme na pole modulu `numpy`. |
| 8 | + |
| 9 | +```py |
| 10 | +staty_list = staty.to_numpy().tolist() |
| 11 | +print(staty_list[0]) |
| 12 | +``` |
| 13 | + |
| 14 | +```shell |
| 15 | +['Kabul', 'Asia', 'Southern Asia', 27657145, 652230.0, 27.8] |
| 16 | +``` |
| 17 | + |
| 18 | +Ve výsledných seznamech nám chybí názvy států. Potíž je v tom, že index se v Pandas nebere jako součást dat. Pokud chceme index vrátit do původního stavu a mít ho jako automaticky generovaná čísla řádků, můžeme použít metodu `reset_index`. S její pomocí pak už dokážeme dostat z DataFramu čistá data takto |
| 19 | + |
| 20 | +```py |
| 21 | +staty_list = staty.reset_index().to_numpy().tolist() |
| 22 | +print(staty_list[0]) |
| 23 | +``` |
| 24 | + |
| 25 | +```shell |
| 26 | +['Afghanistan', 'Kabul', 'Asia', 'Southern Asia', 27657145, 652230.0, 27.8] |
| 27 | +``` |
| 28 | + |
| 29 | +### Vytvoření DataFrame ze seznamu |
| 30 | + |
| 31 | +Zkusme si nyní opačný postup, převedeme si seznam seznamů (což je jiný zápis dvourozměrné tabulky) na `DataFrame`. Jistě si vzpomínáš na příklad se známkami z testu, kterým jsme měli na prvním workshopu. |
| 32 | + |
| 33 | +```py |
| 34 | +znamky = [ |
| 35 | + ['Petr', 2], |
| 36 | + ['Roman', 1], |
| 37 | + ['Jitka', 3], |
| 38 | + ['Zuzana', 5], |
| 39 | + ['Ondřej', 2], |
| 40 | + ['Julie', 2], |
| 41 | + ['Karel', 4], |
| 42 | + ['Anna', 1], |
| 43 | + ['Eva', 1] |
| 44 | +] |
| 45 | +``` |
| 46 | + |
| 47 | +Naším úkolem bylo spočítat průměrnou známku. K tomu jsme použili cyklus. |
| 48 | + |
| 49 | +```py |
| 50 | +soucet = 0 |
| 51 | +for radek in znamky: |
| 52 | + soucet = soucet + radek[1] |
| 53 | +prumer = soucet / len(znamky) |
| 54 | +``` |
| 55 | + |
| 56 | +Průměrnou známku ale můžeme spočítat i pomocí `pandas`. Pomocí funkce `DataFrame` převedeme proměnnou `znamky` na `DataFrame`. Abychom měli v `DataFrame` správné názvy sloupců, definujeme je jako parametr `columns`. |
| 57 | + |
| 58 | +Následně vybereme data ve sloupci `znamka`. Protože jsme vybrali jeden sloupec, získáme sérii. Průměrnou hodnotu v sérii pak spočítáme pomocí funkce `mean`. |
| 59 | + |
| 60 | +```py |
| 61 | +znamky = pandas.DataFrame(znamky, columns=['student', 'znamka']) |
| 62 | +prumer = znamky["znamka"].mean() |
| 63 | +``` |
| 64 | + |
| 65 | +Přehled všech funkcí, které pro sérii můžeš použít, opět najdeš [v dokumentaci](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html). |
| 66 | + |
| 67 | +### Vytvoření DataFrame ze seznamu slovníků |
| 68 | + |
| 69 | +Pokud jsi absolvovala Úvod do programování v Pythonu 2, znáš již též slovníky. I pole složené ze slovníků můžeme převést na `DataFrame`. |
| 70 | + |
| 71 | +```py |
| 72 | +nakupy = [ |
| 73 | + {"person": "Petr", "item": "Prací prášek", "value": 399}, |
| 74 | + {"person": "Ondra", "item": "Savo", "value": 80}, |
| 75 | + {"person": "Petr", "item": "Toaletní papír", "value": 65}, |
| 76 | + {"person": "Libor", "item": "Pivo", "value": 124}, |
| 77 | + {"person": "Petr", "item": "Pytel na odpadky", "value": 75}, |
| 78 | + {"person": "Míša", "item": "Utěrky na nádobí", "value": 130}, |
| 79 | + {"person": "Ondra", "item": "Toaletní papír", "value": 120}, |
| 80 | + {"person": "Míša", "item": "Pečící papír", "value": 30}, |
| 81 | + {"person": "Zuzka", "item": "Savo", "value": 80}, |
| 82 | + {"person": "Pavla", "item": "Máslo", "value": 50}, |
| 83 | + {"person": "Ondra", "item": "Káva", "value": 300} |
| 84 | +] |
| 85 | +``` |
| 86 | + |
| 87 | +Výhodou je, že nyní nemusíme přidávat názvy sloupců, protože ty už funkce `DataFrame` získá z klíčů slovníků. |
| 88 | + |
| 89 | +```py |
| 90 | +nakupy = pandas.DataFrame(nakupy) |
| 91 | +nakupy.info() |
| 92 | +``` |
| 93 | +```shell |
| 94 | +<class 'pandas.core.frame.DataFrame'> |
| 95 | +RangeIndex: 11 entries, 0 to 10 |
| 96 | +Data columns (total 3 columns): |
| 97 | + # Column Non-Null Count Dtype |
| 98 | +--- ------ -------------- ----- |
| 99 | + 0 person 11 non-null object |
| 100 | + 1 item 11 non-null object |
| 101 | + 2 value 11 non-null int64 |
| 102 | +dtypes: int64(1), object(2) |
| 103 | +memory usage: 392.0+ bytes |
| 104 | +``` |
0 commit comments