|
295 | 295 | "cell_type": "markdown", |
296 | 296 | "metadata": {}, |
297 | 297 | "source": [ |
298 | | - "💡 V tomto případě jsme přímo upravili existující `DataFrame`. Většina metod / operací v `pandas` (už znáš např. `set_index`) ve výchozím nastavení vždy vrací nový objekt - je to dobrým zvykem, který budeme dodržovat. Přiřazování sloupců je jednou z výjimek tohoto jinak uznávaného pravidla (tou druhou je pohodlnost).\n", |
299 | | - "\n", |
300 | | - "<div style=\"background-color: yellow; color: red\"><b>TODO</b>: \n", |
301 | | - " Jak to píšu, tak mi to zase tak samozřejmé nepřijde. Nějak bych tohle chtěl zformulovat líp.</div>\n", |
| 298 | + "💡 V tomto případě jsme přímo upravili existující `DataFrame`. Většina metod / operací v `pandas` (už znáš např. `set_index`) ve výchozím nastavení vždy vrací nový objekt - je to dobrým zvykem, který budeme dodržovat. Přiřazování sloupců je jednou z akceptovaných výjimek tohoto jinak uznávaného pravidla, zejména když se tabulka upravuje jen v úzkém rozsahu řádků kódů.\n", |
302 | 299 | " \n", |
303 | | - "`DataFrame` nabízí ještě metodu `assign`, která nemění tabulku, ale vytváří její kopii s přidanými (nebo nahrazenými) sloupci:" |
| 300 | + "`DataFrame` však nabízí ještě metodu `assign`, která nemění tabulku, ale vytváří její kopii s přidanými (nebo nahrazenými) sloupci. Pokud se chceš vyhnout nepříjemnému sledování, kterou tabulku jsi změnil/a či nikoliv, `assign` ti můžeme jen doporučit." |
304 | 301 | ] |
305 | 302 | }, |
306 | 303 | { |
|
473 | 470 | "cell_type": "markdown", |
474 | 471 | "metadata": {}, |
475 | 472 | "source": [ |
476 | | - "Není to zase tak často praktické, ale pro hodnoty nového sloupce lze použít i jednu skalární hodnotu:" |
| 473 | + "Pro hodnoty nového sloupce lze použít i jednu skalární hodnotu (v praxi se ale s touto potřebou nepotkáme tak často):" |
477 | 474 | ] |
478 | 475 | }, |
479 | 476 | { |
|
1146 | 1143 | "source": [ |
1147 | 1144 | "### Odstranění řádku\n", |
1148 | 1145 | "\n", |
1149 | | - "Pro odebrání sloupce či řádku z DataFrame slouží metoda `drop`. Její první argument očekává označení (index) jednoho nebo více řádků či sloupců, které chceš odebrat. Argument axis označuje, ve které dimenzi se operace má aplikovat (0 či 1). Číslo je intuitivní a odpovídá pořadí, ve kterém se uvádějí klíče při odkazování na buňky.\n", |
| 1146 | + "Pro odebrání sloupce či řádku z DataFrame slouží metoda `drop`. Její první argument očekává označení (index) jednoho nebo více řádků či sloupců, které chceš odebrat. Argument axis označuje, ve které dimenzi se operace má aplikovat - můžeš použít buď číslo 0 či 1 (odpovídá pořadí od nuly, ve kterém se uvádějí klíče při odkazování na buňky), anebo pojmenování dané dimenze:\n", |
1150 | 1147 | "\n", |
1151 | 1148 | "Osa (axis):\n", |
1152 | 1149 | "\n", |
1153 | | - "- 0 = řádky\n", |
1154 | | - "- 1 = sloupce\n", |
| 1150 | + "- 0 nebo \"rows\" nebo \"index\" = řádky\n", |
| 1151 | + "- 1 nebo \"columns\" = sloupce\n", |
| 1152 | + "\n", |
1155 | 1153 | "(Tento argument používají i četné další metody a funkce, proto se ujisti, že mu rozumíš).\n", |
1156 | 1154 | "\n", |
1157 | 1155 | "Když už jsme se vrátili do budoucnosti (resp. současnosti), vypořádejme se nemilosrdně s Plutem (pro metodu `drop` je výchozí hodnotou argumentu `axis` 0, a tedy to nemusíme psát):" |
|
1296 | 1294 | } |
1297 | 1295 | ], |
1298 | 1296 | "source": [ |
1299 | | - "planety = planety.drop(\"Pluto\") # Přidej axis=0, chceš-li být explicitní\n", |
| 1297 | + "planety = planety.drop(\"Pluto\") # Přidej axis=\"rows\", chceš-li být explicitní\n", |
1300 | 1298 | "planety" |
1301 | 1299 | ] |
1302 | 1300 | }, |
|
1440 | 1438 | } |
1441 | 1439 | ], |
1442 | 1440 | "source": [ |
1443 | | - "planety = planety.drop(\"je_planeta\", axis=1) \n", |
| 1441 | + "planety = planety.drop(\"je_planeta\", axis=\"columns\") \n", |
1444 | 1442 | "planety" |
1445 | 1443 | ] |
1446 | 1444 | }, |
|
1464 | 1462 | "# planety.drop(\"je_planeta\", axis=1, inplace=True)" |
1465 | 1463 | ] |
1466 | 1464 | }, |
| 1465 | + { |
| 1466 | + "cell_type": "markdown", |
| 1467 | + "metadata": {}, |
| 1468 | + "source": [ |
| 1469 | + "Ale opravdu to nedělej!" |
| 1470 | + ] |
| 1471 | + }, |
1467 | 1472 | { |
1468 | 1473 | "cell_type": "markdown", |
1469 | 1474 | "metadata": {}, |
|
1895 | 1900 | ], |
1896 | 1901 | "source": [ |
1897 | 1902 | "url = \"https://raw.githubusercontent.com/janpipek/data-pro-pyladies/master/data/countries.csv\"\n", |
1898 | | - "countries = pd.read_csv(url, index_col=\"name\") # Místo `set_index`\n", |
| 1903 | + "\n", |
| 1904 | + "# Místo `set_index` vybereme index rovnou při načítání\n", |
| 1905 | + "countries = pd.read_csv(url, index_col=\"name\")\n", |
| 1906 | + "\n", |
1899 | 1907 | "countries = countries.sort_index()\n", |
1900 | 1908 | "countries" |
1901 | 1909 | ] |
|
1998 | 2006 | "cell_type": "markdown", |
1999 | 2007 | "metadata": {}, |
2000 | 2008 | "source": [ |
2001 | | - "Typy v pandas vycházejí z toho, jak je definuje knihovna `numpy` (obecně užitečná pro práci s numerickými poli a poskytující vektorové operace s rychlostí řádově rychlejší než v Pythonu jako takovém). Ta potřebuje především vědět, jak alokovat pole pro prvky daného typu - na to, aby mohly být seřazeny efektivně jeden za druhým, a tedy i kolik bajtů paměti každý zabírá. Kopíruje přitom \"nativní\" datové typy, jako je můžeš znát, pokud už máš takovou zkušenost, např. z jazyka C. Umístění paměti je něco, co v Pythonu obvykle neřešíme, ale rychlé počítání se bez toho neobejde. My nepůjdeme do detailů, ale požadavek na rychlost se nám tu a tam vynoří a my budeme klást důraz na to, aby se operace dělaly \"vektorově\", řešily \"na úrovni numpy\".\n", |
| 2009 | + "Typy v pandas vycházejí z toho, jak je definuje knihovna `numpy` (obecně užitečná pro práci s numerickými poli a poskytující vektorové operace s rychlostí řádově vyšší než v Pythonu jako takovém). Ta potřebuje především vědět, jak alokovat pole pro prvky daného typu - na to, aby mohly být seřazeny efektivně jeden za druhým, a tedy i kolik bajtů paměti každý zabírá. Kopíruje přitom \"nativní\" datové typy, jako je můžeš znát, pokud už máš takovou zkušenost, např. z jazyka C. Umístění paměti je něco, co v Pythonu obvykle neřešíme, ale rychlé počítání se bez toho neobejde. My nepůjdeme do detailů, ale požadavek na rychlost se nám tu a tam vynoří a my budeme klást důraz na to, aby se operace dělaly \"vektorově\", řešily \"na úrovni numpy\".\n", |
2002 | 2010 | "\n", |
2003 | 2011 | "Poněkud kryptický systém typů v `numpy` (popsaný v [dokumentaci](https://docs.scipy.org/doc/numpy/user/basics.types.html)) je naštěstí v `pandas` (mírně) zjednodušen a nabízí jen několik užitečných základních (rodin) typů, které si teď představíme." |
2004 | 2012 | ] |
|
2729 | 2737 | "data": { |
2730 | 2738 | "text/plain": [ |
2731 | 2739 | "name\n", |
2732 | | - "Afghanistan 26700 days 00:54:33.011664\n", |
2733 | | - "Albania 23388 days 00:54:33.011664\n", |
2734 | | - "Algeria 20898 days 00:54:33.011664\n", |
2735 | | - "Andorra 9647 days 00:54:33.011664\n", |
2736 | | - "Angola 15730 days 00:54:33.011664\n", |
| 2740 | + "Afghanistan 26715 days 19:30:33.070854\n", |
| 2741 | + "Albania 23403 days 19:30:33.070854\n", |
| 2742 | + "Algeria 20913 days 19:30:33.070854\n", |
| 2743 | + "Andorra 9662 days 19:30:33.070854\n", |
| 2744 | + "Angola 15745 days 19:30:33.070854\n", |
2737 | 2745 | " ... \n", |
2738 | | - "Venezuela 27069 days 00:54:33.011664\n", |
2739 | | - "Vietnam 15437 days 00:54:33.011664\n", |
2740 | | - "Yemen 26385 days 00:54:33.011664\n", |
2741 | | - "Zambia 20113 days 00:54:33.011664\n", |
2742 | | - "Zimbabwe 14367 days 00:54:33.011664\n", |
| 2746 | + "Venezuela 27084 days 19:30:33.070854\n", |
| 2747 | + "Vietnam 15452 days 19:30:33.070854\n", |
| 2748 | + "Yemen 26400 days 19:30:33.070854\n", |
| 2749 | + "Zambia 20128 days 19:30:33.070854\n", |
| 2750 | + "Zimbabwe 14382 days 19:30:33.070854\n", |
2743 | 2751 | "Name: un_accession, Length: 193, dtype: timedelta64[ns]" |
2744 | 2752 | ] |
2745 | 2753 | }, |
|
6816 | 6824 | } |
6817 | 6825 | ], |
6818 | 6826 | "source": [ |
6819 | | - "countries.sort_index(axis=1)" |
| 6827 | + "countries.sort_index(axis=\"columns\")" |
6820 | 6828 | ] |
6821 | 6829 | }, |
6822 | 6830 | { |
|
6871 | 6879 | "cell_type": "markdown", |
6872 | 6880 | "metadata": {}, |
6873 | 6881 | "source": [ |
6874 | | - "Jednou z možností je i vytvoření HTML tabulky (které lze dodat i různé formátování, což ovšem nechme raději na jindy nebo na doma, viz [dokumentace \"Styling\"](https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html)). Výchozí `to_html` si bohužel neporadí s \"nezápadními\" symboly (což je třeba ☿), a tak mu (v našem konkrétním případě) musíme předat korektně otevřený soubor:" |
| 6882 | + "Excel ani CSV nejsou formáty pro ukládání velikých dat zcela vhodné - první je vázaný na jeden konkrétní kancelářský balík, druhý zase v textové reprezentaci ztrácí informace o typech, nemluvě o výkonu a datové náročnosti. Z jiných formátů můžeš vyzkoušet například [feather](https://github.com/wesm/feather) nebo [parquet](https://en.wikipedia.org/wiki/Apache_Parquet)." |
6875 | 6883 | ] |
6876 | 6884 | }, |
6877 | 6885 | { |
|
6880 | 6888 | "metadata": {}, |
6881 | 6889 | "outputs": [], |
6882 | 6890 | "source": [ |
6883 | | - "# planety.to_html(\"planety.html\") # To nefunguje :-(\n", |
| 6891 | + "countries.reset_index().to_feather(\"countries.feather\") # Pozor: feather neukládá index" |
| 6892 | + ] |
| 6893 | + }, |
| 6894 | + { |
| 6895 | + "cell_type": "markdown", |
| 6896 | + "metadata": {}, |
| 6897 | + "source": [ |
| 6898 | + "Jednou z možností je i vytvoření HTML tabulky (které lze dodat i různé formátování, což ovšem nechme raději na jindy nebo na doma, viz [dokumentace \"Styling\"](https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html)). Výchozí `to_html` si bohužel neporadí s \"nezápadními\" symboly (což je třeba ☿), a tak mu (v našem konkrétním případě) musíme předat korektně otevřený soubor:" |
| 6899 | + ] |
| 6900 | + }, |
| 6901 | + { |
| 6902 | + "cell_type": "code", |
| 6903 | + "execution_count": 59, |
| 6904 | + "metadata": {}, |
| 6905 | + "outputs": [], |
| 6906 | + "source": [ |
| 6907 | + "# planety.to_html(\"planety.html\") # To (zatím) nefunguje :-(\n", |
6884 | 6908 | "\n", |
6885 | 6909 | "with open(\"planety.html\", \"w\", encoding=\"utf-8\") as out:\n", |
6886 | 6910 | " planety.to_html(out)" |
6887 | 6911 | ] |
6888 | 6912 | }, |
6889 | 6913 | { |
6890 | 6914 | "cell_type": "code", |
6891 | | - "execution_count": 59, |
| 6915 | + "execution_count": 60, |
6892 | 6916 | "metadata": {}, |
6893 | 6917 | "outputs": [], |
6894 | 6918 | "source": [ |
|
0 commit comments