Knihovna Pandas: použití metody groupby, naformátování a export tabulek pro tisk

5. 1. 2021
Doba čtení: 35 minut

Sdílet

V úvodní části si ukážeme některé způsoby použití metody groupby, jež je velmi často používána při analýze dat. V části druhé se seznámíme s přípravou datových rámců pro tisk či zobrazení na terminálu.

Obsah

1. Zpracování a agregace údajů s využitím metody groupby

2. Načtení datového souboru

3. Rozdělení záznamů metodou groupby s agregací výsledků

4. Pokus o seřazení jazyků podle celkového počtu vítězství

5. Přejmenování vybraného sloupce či sloupců v agregovaném datovém rámci

6. Seřazení jazyků sestupně

7. Další možnosti nabízené operací groupby

8. Naformátování tabulky před jejím zobrazením na terminálu

9. Knihovna tabulate

10. Zobrazení tabulky naformátované knihovnou tabulate

11. Zobrazení naformátované tabulky s využitím formátu „pretty“

12. Naformátování tabulky napodobující psql

13. Styly (formáty) zobrazení tabulek nabízené knihovnou tabulate

14. Využití všech stylů nabízených knihovnou tabulate

15. Zobrazení tabulek naformátovaných předchozím demonstračním příkladem

16. Alternativní způsob získání jmen všech formátů

17. Obsah následujícího článku

18. Repositář s demonstračními příklady

19. Odkazy na předchozí části seriálu o knihovně Pandas

20. Odkazy na Internetu

1. Zpracování a agregace údajů s využitím metody groupby

V první polovině dnešního článku si popíšeme způsob zpracování a agregace údajů v datových rámcích s využitím metody pojmenované groupby. Jedná se o metodu, která umožňuje údaje z datových rámců rozdělit do skupin s tím, že se údaje z každé skupiny nějakým způsobem agregují; například se zjistí jejich počet, součet hodnot ve vybraném sloupci atd. Současně si ukážeme i další užitečné metody, například sort_values, rename, count apod.

Zpracovávat přitom budeme tabulku obsahující vybrané vítězné programovací jazyky pro daný kalendářní rok:

Year    Winner
2019    C
2018    Python
2017    C
2016    Go
2015    Java
2014    JavaScript
2013    Transact-SQL
2012    Objective-C
2011    Objective-C
2010    Python
2009    Go
2008    C
2007    Python
2006    Ruby
2005    Java
2004    PHP
2003    C++
Poznámka: nyní je již možné datový soubor doplnit i o vítěze z loňska – je jím opět programovací jazyk Python.

2. Načtení datového souboru

Datový soubor s informacemi o vítězných programovacích jazycích používá formát TSV (Tab-Separated Values). Z tohoto důvodu můžeme pro jeho načtení a konverzi do datového rámce použít funkci read_csv s explicitním nastavením oddělovače buněk, kterým je řídicí znak „\t“. Následně určíme, který sloupec se má převést na index a obsah datového rámce vytiskneme společně s podrobnějšími informacemi o tomto rámci:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(df)
print()
 
print(df.info())

Tabulka s obsahem datového rámce vypadá takto:

            Winner
Year
2019             C
2018        Python
2017             C
2016            Go
2015          Java
2014    JavaScript
2013  Transact-SQL
2012   Objective-C
2011   Objective-C
2010        Python
2009            Go
2008             C
2007        Python
2006          Ruby
2005          Java
2004           PHP
2003           C++

Podrobnější informace o datovém rámci:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 17 entries, 2019 to 2003
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   Winner  17 non-null     object
dtypes: object(1)
memory usage: 272.0+ bytes
None

3. Rozdělení záznamů metodou groupby s agregací výsledků

Metoda groupby nám umožňuje provést následující operace:

  1. Rozdělení údajů v datovém rámci na základě podmínky
  2. Aplikace funkce na výsledný datový blok
  3. Kombinace či agregace výsledků

Příkladem může být vytvoření nového datového rámce, který bude pro každý programovací jazyk obsahovat počet let, v nichž tento jazyk zvítězil (resp. kdy byl vybrán). Jazyky tedy rozdělíme podle jejich jména (sloupec „Winner“):

# rozdělení do skupin
gb = df.groupby(["Winner"])

Výsledkem bude nový datový blok (ale ne datový rámec), nad nímž můžeme provádět další operace, zejména agregaci. Můžeme například zjistit, kolikrát se každý jazyk ve své skupině vyskytuje. Vybereme tedy (jediný) sloupec „Winner“ a pro celou skupinu zavoláme metodu count:

# agregace výsledků
result = gb[["Winner"]].count()

Výsledek je ve formě datového rámce, který lze zobrazit či dále zpracovat:

# zobrazení výsledků
print(result)

Úplný zdrojový kód dnešního druhého demonstračního příkladu vypadá následovně:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(df)
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# zobrazení výsledků
print(result)

S výsledkem:

            Winner
Year
2019             C
2018        Python
2017             C
2016            Go
2015          Java
2014    JavaScript
2013  Transact-SQL
2012   Objective-C
2011   Objective-C
2010        Python
2009            Go
2008             C
2007        Python
2006          Ruby
2005          Java
2004           PHP
2003           C++
 
              Winner
Winner
C                  3
C++                1
Go                 2
Java               2
JavaScript         1
Objective-C        2
PHP                1
Python             3
Ruby               1
Transact-SQL       1

4. Pokus o seřazení jazyků podle celkového počtu vítězství

V předchozím příkladu nebyly jazyky seřazeny podle počtu vítězství, ale abecedně. Ovšem vzhledem k tomu, že výsledkem agregace je běžný datový rámec, můžeme seřazení provést metodou sort_values, v níž navíc určíme, že se má seřazení provést přímo v rámci daného datového rámce (tedy nikoli tak, že se vrátí nový datový rámec, což je sice čistší řešení, ovšem u větších paměťových rámců je časově i paměťově náročnější):

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(df)
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# pokusíme se o seřazení hodnot podle jediného sloupce
result.sort_values(by=["Winner"], inplace=True)
 
# zobrazení výsledků
print(result)

Výsledek ovšem nebude odpovídat očekávání:

            Winner
Year
2019             C
2018        Python
2017             C
2016            Go
2015          Java
2014    JavaScript
2013  Transact-SQL
2012   Objective-C
2011   Objective-C
2010        Python
2009            Go
2008             C
2007        Python
2006          Ruby
2005          Java
2004           PHP
2003           C++
 
Traceback (most recent call last):
  File "data_frame_group_by_03_try_to_sort.py", line 23, in <module>
    result.sort_values(by=["Winner"], inplace=True)
  File "/home/ptisnovs/.local/lib/python3.6/site-packages/pandas/core/frame.py", line 5298, in sort_values
    k = self._get_label_or_level_values(by, axis=axis)
  File "/home/ptisnovs/.local/lib/python3.6/site-packages/pandas/core/generic.py", line 1558, in _get_label_or_level_values
    self._check_label_or_level_ambiguity(key, axis=axis)
  File "/home/ptisnovs/.local/lib/python3.6/site-packages/pandas/core/generic.py", line 1518, in _check_label_or_level_ambiguity
    raise ValueError(msg)
ValueError: 'Winner' is both an index level and a column label, which is ambiguous.
Z chybového hlášení je zřejmé, jaký problém nastal – (jediný) sloupec datového rámce se jmenuje stejně jako index, což musíme napravit. O tom, proč může být index pojmenovaný, se zmíníme příště při vysvětlování problematiky multiindexů.

5. Přejmenování vybraného sloupce či sloupců v agregovaném datovém rámci

Nezávisle na tom, jak je pojmenovaný index (a zda se náhodou nejmenuje stejně jako nějaký sloupec) můžeme provést přejmenování vybraného sloupce metodou rename. U této metody lze rovněž specifikovat, zda má být výsledkem nový datový rámec či zda se má modifikovat ten rámec, jehož metoda se volá. Sloupec či sloupce, které se mají přejmenovat, se zapisují formou slovníku, kde klíčem je původní jméno sloupce a hodnotou nové jméno:

# přejmenování sloupce
result.rename(columns={"Winner": "Language"}, inplace=True)

Takto upravený demonstrační příklad by již měl být plně funkční:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(df)
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# přejmenování sloupce
result.rename(columns={"Winner": "Language"}, inplace=True)
 
# seřazení výsledků
result.sort_values(by=["Language"], inplace=True)
 
# zobrazení výsledků
print(result)

Výsledek získaný po spuštění tohoto příkladu:

            Winner
Year
2019             C
2018        Python
2017             C
2016            Go
2015          Java
2014    JavaScript
2013  Transact-SQL
2012   Objective-C
2011   Objective-C
2010        Python
2009            Go
2008             C
2007        Python
2006          Ruby
2005          Java
2004           PHP
2003           C++

Povšimněte si, že nyní jsou již jazyky seřazeny podle počtu vítězství:

              Language
Winner
C++                  1
JavaScript           1
PHP                  1
Ruby                 1
Transact-SQL         1
Go                   2
Java                 2
Objective-C          2
C                    3
Python               3

6. Seřazení jazyků sestupně

Pochopitelně je možné jazyky seřadit i sestupně, což je praktičtější. K tomuto účelu opět použijeme metodu sort_values, ovšem navíc uvedeme i nepovinný parametr ascending nastavený na hodnotu False:

result.sort_values(by=["Language"], inplace=True, ascending=False)

Úplný zdrojový kód takto upraveného demonstračního příkladu:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(df)
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# přejmenování sloupce
result.rename(columns={"Winner": "Language"}, inplace=True)
 
# seřazení výsledků v opačném pořadí (od nejlepšího)
result.sort_values(by=["Language"], inplace=True, ascending=False)
 
# zobrazení výsledků
print(result)

Nyní již bude tabulka vítězů sestavena podle očekávání:

            Winner
Year
2019             C
2018        Python
2017             C
2016            Go
2015          Java
2014    JavaScript
2013  Transact-SQL
2012   Objective-C
2011   Objective-C
2010        Python
2009            Go
2008             C
2007        Python
2006          Ruby
2005          Java
2004           PHP
2003           C++
 
              Language
Winner
C                    3
Python               3
Go                   2
Java                 2
Objective-C          2
C++                  1
JavaScript           1
PHP                  1
Ruby                 1
Transact-SQL         1

7. Další možnosti nabízené operací groupby

Výsledná struktura vrácená operací groupby ve skutečnosti umožňuje nad daty provádět i další operace, zejména jejich transformaci, popř. filtraci, což si ukážeme mj. i příště. Totéž platí i pro rozdělení záznamů podle většího množství kritérií. Vytvořené skupiny je taktéž možné zobrazit:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
import pandas
import pprint
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(df)
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# zobrazení skupin
pprint.pprint(gb.groups)

Výsledek:

{'C': Int64Index([2019, 2017, 2008], dtype='int64', name='Year'),
 'C++': Int64Index([2003], dtype='int64', name='Year'),
 'Go': Int64Index([2016, 2009], dtype='int64', name='Year'),
 'Java': Int64Index([2015, 2005], dtype='int64', name='Year'),
 'JavaScript': Int64Index([2014], dtype='int64', name='Year'),
 'Objective-C': Int64Index([2012, 2011], dtype='int64', name='Year'),
 'PHP': Int64Index([2004], dtype='int64', name='Year'),
 'Python': Int64Index([2018, 2010, 2007], dtype='int64', name='Year'),
 'Ruby': Int64Index([2006], dtype='int64', name='Year'),
 'Transact-SQL': Int64Index([2013], dtype='int64', name='Year')}

8. Naformátování tabulky před jejím zobrazením na terminálu

Komplikovanější tabulky je vhodné před jejich zobrazením na terminálu naformátovat, popř. zvýraznit jejich okraje i okraje buněk. K tomu lze použít například metodu to_markdown. Pro export do dalších formátů pak slouží metody to_html, to_json, to_latex a to_csv. Ukažme si nejprve použití první zmíněné metody, která tabulku naformátuje takovým způsobem, aby ji bylo možné zařadit do nástrojů zpracovávajících rozšířený Markdown (protože vlastní Markdown tabulky nepodporuje):

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(df.to_markdown())
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# přejmenování sloupce
result.rename(columns={"Winner": "Language"}, inplace=True)
 
# seřazení výsledků
result.sort_values(by=["Language"], inplace=True, ascending=False)
 
# zobrazení výsledků
print(result.to_markdown())

Výsledek by měl vypadat následovně:

|   Year | Winner       |
|-------:|:-------------|
|   2019 | C            |
|   2018 | Python       |
|   2017 | C            |
|   2016 | Go           |
|   2015 | Java         |
|   2014 | JavaScript   |
|   2013 | Transact-SQL |
|   2012 | Objective-C  |
|   2011 | Objective-C  |
|   2010 | Python       |
|   2009 | Go           |
|   2008 | C            |
|   2007 | Python       |
|   2006 | Ruby         |
|   2005 | Java         |
|   2004 | PHP          |
|   2003 | C++          |
 
| Winner       |   Language |
|:-------------|-----------:|
| C            |          3 |
| Python       |          3 |
| Go           |          2 |
| Java         |          2 |
| Objective-C  |          2 |
| C++          |          1 |
| JavaScript   |          1 |
| PHP          |          1 |
| Ruby         |          1 |
| Transact-SQL |          1 |
Poznámka: pokud se zobrazí následující chybové hlášení, znamená to, že není nainstalována knihovna tabulate, o níž se zmíníme v navazujících kapitolách:
Traceback (most recent call last):
  File "data_frame_to_markdown.py", line 13, in <module>
    print(df.to_markdown())
  File "/home/ptisnovs/.local/lib/python3.6/site-packages/pandas/core/frame.py", line 2261, in to_markdown
    tabulate = import_optional_dependency("tabulate")
  File "/home/ptisnovs/.local/lib/python3.6/site-packages/pandas/compat/_optional.py", line 110, in import_optional_dependency
    raise ImportError(msg) from None
ImportError: Missing optional dependency 'tabulate'.  Use pip or conda to install tabulate.

9. Knihovna tabulate

Pro zobrazení tabulek s využitím různých formátovacích pravidel (resp. stylů) lze použít knihovnu nazvanou příznačně tabulate, jejíž repositář je dostupný na adrese https://github.com/astanin/python-tabulate. Tato knihovna dokáže naformátovat datové rámce z knihovny Pandas, ovšem dokáže pracovat například i s n-dimenzionálními poli z Numpy atd. Cílem knihovny je poskytnout formáty tabulek pro zobrazení na terminálech (s pevnými šířkami znaků), ovšem přidány byly i styly pro export tabulek do Markdownu, LaTeXu atd. – viz navazující kapitoly.

Instalace této malé knihovny (tvořené jediným zdrojovým souborem) je snadná:

$ pip3 install --user tabulate
 
Collecting tabulate
  Downloading https://files.pythonhosted.org/packages/c4/f4/770ae9385990f5a19a91431163d262182d3203662ea2b5739d0fcfc080f1/tabulate-0.8.7-py3-none-any.whl
Installing collected packages: tabulate
Successfully installed tabulate-0.8.7

Možnosti této knihovny budou ukázány v navazujících kapitolách.

10. Zobrazení tabulky naformátované knihovnou tabulate

Podívejme se nyní na způsob zobrazení naformátované tabulky s využitím knihovny tabulate. Ve skutečnosti je to snadné. Po importu této knihovny je pouze nutné namísto přímého vytištění datového rámce zavolat funkci tabulate a předat jí příslušný datový rámec:

print(tabulate(df))

Navíc je možné určit, jak se mají zobrazit hlavičky sloupců:

print(tabulate(df, headers="keys"))

Předchozí demonstrační příklad nyní upravíme tak, aby se zobrazily naformátované tabulky:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
from tabulate import tabulate
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(tabulate(df, headers="keys"))
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# přejmenování sloupce
result.rename(columns={"Winner": "Language"}, inplace=True)
 
# seřazení výsledků
result.sort_values(by=["Language"], inplace=True, ascending=False)
 
# zobrazení výsledků
print(tabulate(result, headers="keys"))

S tímto výsledkem:

  Year  Winner
------  ------------
  2019  C
  2018  Python
  2017  C
  2016  Go
  2015  Java
  2014  JavaScript
  2013  Transact-SQL
  2012  Objective-C
  2011  Objective-C
  2010  Python
  2009  Go
  2008  C
  2007  Python
  2006  Ruby
  2005  Java
  2004  PHP
  2003  C++
 
Winner          Language
------------  ----------
C                      3
Python                 3
Go                     2
Java                   2
Objective-C            2
C++                    1
JavaScript             1
PHP                    1
Ruby                   1
Transact-SQL           1

11. Zobrazení naformátované tabulky s využitím formátu „pretty“

Knihovna tabulate nabízí programátorům přibližně dvacet způsobů naformátování tabulky při jejím tisku. Formát tabulky se volí nepovinným parametrem tablefmt:

tabulate(datový_rámec, headers="keys", tablefmt=jméno_formátu)

Příkladem může být použití formátu nazvaného „pretty“:

tabulate(datový_rámec, headers="keys", tablefmt="pretty")

Předchozí demonstrační příklad lze tedy upravit takovým způsobem, aby zobrazil tabulku v odlišném formátu:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
from tabulate import tabulate
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(tabulate(df, headers="keys", tablefmt="pretty"))
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# přejmenování sloupce
result.rename(columns={"Winner": "Language"}, inplace=True)
 
# seřazení výsledků
result.sort_values(by=["Language"], inplace=True, ascending=False)
 
# zobrazení výsledků
print(tabulate(result, headers="keys", tablefmt="pretty"))

Po spuštění tohoto demonstračního příkladu by se měla zobrazit dvojice tabulek v následujícím formátu (mj. kompatibilním i s hloupými „ASCII-only“ zařízeními):

+------+--------------+
| Year |    Winner    |
+------+--------------+
| 2019 |      C       |
| 2018 |    Python    |
| 2017 |      C       |
| 2016 |      Go      |
| 2015 |     Java     |
| 2014 |  JavaScript  |
| 2013 | Transact-SQL |
| 2012 | Objective-C  |
| 2011 | Objective-C  |
| 2010 |    Python    |
| 2009 |      Go      |
| 2008 |      C       |
| 2007 |    Python    |
| 2006 |     Ruby     |
| 2005 |     Java     |
| 2004 |     PHP      |
| 2003 |     C++      |
+------+--------------+
 
+--------------+----------+
|    Winner    | Language |
+--------------+----------+
|      C       |    3     |
|    Python    |    3     |
|      Go      |    2     |
|     Java     |    2     |
| Objective-C  |    2     |
|     C++      |    1     |
|  JavaScript  |    1     |
|     PHP      |    1     |
|     Ruby     |    1     |
| Transact-SQL |    1     |
+--------------+----------+

12. Naformátování tabulky napodobující psql

Velmi přehledným způsobem je obsah tabulek formátován nástrojem psql, což je terminálové rozhraní ke známé relační databázi PostgreSQL. Tento formát je možné napodobit následovně:

tabulate(datový_rámec, headers="keys", tablefmt="psql")

Předchozí demonstrační příklad si upravíme pro použití tohoto stylu zobrazení tabulek:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
from tabulate import tabulate
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("hall_of_fame.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Year
df.set_index("Year", inplace=True)
 
# datový rámec zobrazíme
print(tabulate(df, headers="keys", tablefmt="psql"))
print()
 
# rozdělení do skupin
gb = df.groupby(["Winner"])
 
# agregace výsledků
result = gb[["Winner"]].count()
 
# přejmenování sloupce
result.rename(columns={"Winner": "Language"}, inplace=True)
 
# seřazení výsledků
result.sort_values(by=["Language"], inplace=True, ascending=False)
 
# zobrazení výsledků
print(tabulate(result, headers="keys", tablefmt="psql"))

Výsledek získaný po spuštění tohoto demonstračního příkladu nyní bude vypadat následovně:

+--------+--------------+
|   Year | Winner       |
|--------+--------------|
|   2019 | C            |
|   2018 | Python       |
|   2017 | C            |
|   2016 | Go           |
|   2015 | Java         |
|   2014 | JavaScript   |
|   2013 | Transact-SQL |
|   2012 | Objective-C  |
|   2011 | Objective-C  |
|   2010 | Python       |
|   2009 | Go           |
|   2008 | C            |
|   2007 | Python       |
|   2006 | Ruby         |
|   2005 | Java         |
|   2004 | PHP          |
|   2003 | C++          |
+--------+--------------+
 
+--------------+------------+
| Winner       |   Language |
|--------------+------------|
| C            |          3 |
| Python       |          3 |
| Go           |          2 |
| Java         |          2 |
| Objective-C  |          2 |
| C++          |          1 |
| JavaScript   |          1 |
| PHP          |          1 |
| Ruby         |          1 |
| Transact-SQL |          1 |
+--------------+------------+

13. Styly (formáty) zobrazení tabulek nabízené knihovnou tabulate

Knihovna tabulate nabízí uživatelům poměrně širokou škálu formátů tabulek. Některé z těchto formátů jsou určeny pro zobrazení tabulky na terminálu, další pak pro zařazení tabulky do různých dokumentů zapsaných ve formátech Markdown, RST, HTML, různé formy Wiki či LaTeX:

# Výstupní formát
1 plain
2 simple
3 github
4 grid
5 fancy_grid
6 pipe
7 orgtbl
8 jira
9 presto
10 pretty
11 psql
12 rst
13 mediawiki
14 moinmoin
15 youtrack
16 html
17 latex
18 latex_raw
19 latex_booktabs
20 textile
21 tsv
Poznámka: není to sice oficiální cesta, ovšem podporované formáty lze zobrazit například takto:
import tabulate
 
for fmt in tabulate._table_formats:
    print(fmt)

S výsledkem:

simple
plain
grid
fancy_grid
github
pipe
orgtbl
jira
presto
pretty
psql
rst
mediawiki
moinmoin
youtrack
html
latex
latex_raw
latex_booktabs
tsv
textile

14. Využití všech stylů nabízených knihovnou tabulate

Po spuštění následujícího demonstračního příkladu se na standardním výstupu zobrazí tabulka s obsahem datového souboru tiobe.tsv. Tabulka je přitom postupně zobrazena s využitím všech formátů, jejichž jména jsou uvedena v n-tici table_styles:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
from tabulate import tabulate
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("tiobe.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Language
df.set_index("Language", inplace=True)
 
# jména stylů
table_styles = (
        "plain",
        "simple",
        "github",
        "grid",
        "fancy_grid",
        "pipe",
        "orgtbl",
        "jira",
        "presto",
        "pretty",
        "psql",
        "rst",
        "mediawiki",
        "moinmoin",
        "youtrack",
        "html",
        "latex",
        "latex_raw",
        "latex_booktabs",
        "textile",
        "tsv"
        )
 
for table_style in table_styles:
    # oddělovač
    print()
    print("*" * 40)
    print("* {:^36s} *".format(table_style))
    print("*" * 40)
    print()
    # datový rámec zobrazíme s vybraným stylem
    print(tabulate(df, headers="keys", tablefmt=table_style))

15. Zobrazení tabulek naformátovaných předchozím demonstračním příkladem

Soubor obsahující tabulku zobrazenou s využitím všech dostupných formátů je poměrně rozsáhlý (cca 54kB), proto není zařazen přímo do textu článku. Naleznete ho na adrese https://raw.githubusercon­tent.com/tisnik/most-popular-python-libs/master/pandas/table_styles.txt.

16. Alternativní způsob získání jmen všech formátů

Ve třinácté kapitole jsme si ukázali alternativní přístup k dostupným (resp. podporovaným) formátům tabulek – jména formátů jsou klíči ve slovníku tabulate._table_formats (což je privátní hodnota!). Pokud nám nevadí, že v kódu přistupujeme k privátní hodnotě (která ani nemusí v novější verzi knihovny existovat), lze předchozí demonstrační příklad zkrátit následovně:

#!/usr/bin/env python3
# vim: set fileencoding=utf-8
 
from tabulate import tabulate, _table_formats as table_styles
import pandas
 
# přečtení zdrojových dat
df = pandas.read_csv("tiobe.tsv", sep="\t")
 
# specifikace indexu - má se získat ze sloupce Language
df.set_index("Language", inplace=True)
 
# zobrazit tabulku ve všech podporovaných formátech
for table_style in table_styles:
    # oddělovač
    print()
    print("*" * 40)
    print("* {:^36s} *".format(table_style))
    print("*" * 40)
    print()
    # datový rámec zobrazíme s vybraným stylem
    print(tabulate(df, headers="keys", tablefmt=table_style))
Poznámka: výsledkem by měly být tabulky shodné s předchozím příkladem, bude se však lišit jejich pořadí.

17. Obsah následujícího článku

V navazující části seriálu o knihovně Pandas si ukážeme použití takzvaných multiindexů, kontingenčních tabulek a rozšíříme si naše znalosti o takzvaných „oknech“, které již byly v některých demonstračních příkladech použity, ovšem bez podrobnějšího vysvětlení.

ict ve školství 24

18. Repositář s demonstračními příklady

Zdrojové kódy všech dnes popsaných demonstračních příkladů určených pro Python 3 a nejnovější stabilní verzi knihovny Pandas byly uloženy do Git repositáře dostupného na adrese https://github.com/tisnik/most-popular-python-libs. V případě, že nebudete chtít klonovat celý repositář (ten je ovšem stále velmi malý, dnes má velikost zhruba několik desítek kilobajtů), můžete namísto toho použít odkazy na jednotlivé příklady, které naleznete v následující tabulce:

# Demonstrační příklad Stručný popis příkladu Cesta
1 data_frame_info1.py výpis obsahu datového rámce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info1.py
2 data_frame_info2.py výpis prvních pěti řádků z datového rámce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info2.py
3 data_frame_info3.py výpis informace o typech sloupců v datovém rámci https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info3.py
4 data_frame_info4.py výpis uspořádaného seznamu jmen všech sloupců https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info4.py
5 data_frame_info5.py podrobnější informace o datovém rámci, obsazení paměti atd. https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info5.py
6 data_frame_info6.py podrobnější informace o datovém rámci, obsazení paměti atd. https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info6.py
7 data_frame_info7.py popis os, počtu dimenzí, tvaru a velikosti datového rámce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info7.py
8 data_frame_info8.py základní statistické informace o datech uložených v rámci https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info8.py
9 data_frame_info9.py výsledkem metody info je nový datový rámec https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_info9.py
       
10 plot_kafka_lags.py zobrazení jednoduchého grafu bez použití knihovny Pandas https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_kaf­ka_lags.py
11 plot_kafka_lags_pandas.py zobrazení jednoduchého grafu s použitím knihovny Pandas https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_kaf­ka_lags_pandas.py
12 plot_kafka_lags_pandas2.py snazší způsob vykreslení grafu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_kaf­ka_lags_pandas2.py
13 plot_kafka_lags_pandas_sma3.py přidání klouzavého průměru do grafu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_kaf­ka_lags_pandas_sma3.py
14 plot_kafka_lags_pandas_sma3_.py vylepšení předchozího příkladu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_kaf­ka_lags_pandas_sma3_.py
15 plot_kafka_lags_pandas_sma10.py klouzavý průměr přes deset hodnot https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_kaf­ka_lags_pandas_sma10.py
16 plot_benchmark_results_line_chart.py liniový graf https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_ben­chmark_results_line_chart­.py
17 plot_benchmark_results_bar_chart1.py sloupcový graf https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_ben­chmark_results_bar_chart.py
18 plot_benchmark_results_bar_chart2.py výběr části datového rámce při vykreslování grafu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_ben­chmark_results_bar_chart.py
19 plot_benchmark_results_bar_chart3.py zobecnění předchozího příkladu – zpracování numerických dat ve všech sloupcích https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_ben­chmark_results_bar_chart.py
       
20 check_types1.py kontrola typů sloupců s využitím knihovny Voluptuous https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/chec­k_types1.py
21 check_types2.py kontrola typů sloupců s využitím knihovny Voluptuous https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/chec­k_types2.py
22 check_types3.py kontrola typů sloupců s využitím knihovny Voluptuous https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/chec­k_types3.py
23 check_types4.py kontrola typů sloupců s využitím knihovny Voluptuous https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/chec­k_types4.py
24 check_types5.py kontrola typů sloupců s využitím knihovny Voluptuous https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/chec­k_types5.py
25 opulent_pandas1.py kontrola typů sloupců s využitím knihovny opulent-pandas https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/o­pulent_pandas1.py
26 opulent_pandas2.py kontrola typů sloupců s využitím knihovny opulent-pandas https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/o­pulent_pandas2.py
27 opulent_pandas3.py kontrola typů sloupců s využitím knihovny opulent-pandas https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/o­pulent_pandas3.py
28 opulent_pandas4.py kontrola typů sloupců s využitím knihovny opulent-pandas https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/o­pulent_pandas4.py
       
29 series01.py konstrukce datové řady z n-tice https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series01.py
30 series02.py konstrukce datové řady z n-tice, specifikace indexů https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series02.py
31 series03.py konstrukce datové řady generátorem, specifikace indexů https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series03.py
32 series04.py příliš malý počet indexů předaných konstruktoru https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series04.py
33 series05.py konstrukce datové řady ze slovníku https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series05.py
34 series06.py konstrukce datové řady ze slovníku, vliv pořadí klíčů https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series06.py
35 series07.py konstrukce datové řady z datového typu OrderedDict https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series07.py
36 series08.py vytvoření nové datové řady z řady stávající – výběr prvků na základě jejich indexů https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series08.py
37 series09.py základní statistické informace o prvcích uložených v datové řadě https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series09.py
38 series10.py vektorové operace nad všemi prvky datové řady https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series10.py
39 series11.py vektorové operace nad všemi prvky datové řady – predikáty https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series11.py
40 series12.py vektorové operace nad dvojicí datových řad https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series12.py
41 series13.py výběr prvků na základě podmínky https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series13.py
42 series14.py výběr prvků na základě podmínky https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series14.py
43 series15.py převody mezi různými datovými typy https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series15.py
44 series16.py převody mezi různými datovými typy https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series16.py
45 series17.py převody mezi různými datovými typy https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series17.py
46 series18.py převody mezi různými datovými typy – s hodnotami None https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series18.py
47 series19.py převody mezi různými datovými typy – s hodnotami None https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series19.py
48 series20.py převody mezi různými datovými typy – s hodnotami NaN https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/series20.py
       
49 plot_series01.py vykreslení průběhu funkce sin, hodnoty jsou uloženy v datové řadě https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries01.py
50 plot_series02.py odlišný typ grafu s vyplněnou plochou pod průběhem funkce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries02.py
51 plot_series03.py sloupcový diagram s vertikálně orientovanými sloupci https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries03.py
52 plot_series04.py sloupcový diagram s horizontálně orientovanými sloupci https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries04.py
53 plot_series05.py graf s KDE – kernel density estimation https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries05.py
54 plot_series06.py vykreslení koláčového grafu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries06.py
55 plot_series07.py použití metody Series.map https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries07.py
56 plot_series08.py vyhlazení grafu s průběhem zašuměného signálu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries08.py
57 plot_series09.py vyhlazení grafu s průběhem zašuměného signálu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries09.py
58 plot_series10.py Gaussovské vyhlazení grafu s průběhem zašuměného signálu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries10.py
59 plot_series11.py vykreslení tří průběhů do jediného grafu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries11.py
60 plot_series12.py vykreslení tří podgrafů do jednoho grafu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/plot_se­ries12.py
       
61 series21_map.py postupná aplikace vybrané funkce na všechny prvky datové řady (lambda) https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries21_map.py
62 series22_map.py postupná aplikace vybrané funkce na všechny prvky datové řady (reference na funkci) https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries22_map.py
63 series23_map.py použití slovníku ve funkci mapy https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries23_map.py
64 series24_map.py použití slovníku ve funkci mapy (zkrácená varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries24_map.py
65 series25_transform.py transformace dat v datové řadě s využitím metody transform https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries25_transform.py
66 series26_transform.py vytvoření více sloupců s transformovanými daty https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries26_transform.py
67 series27_transform.py vytvoření více sloupců s transformovanými daty https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries27_transform.py
68 series28_transform.py použití jmen funkcí ve formě řetězců https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries28_transform.py
69 series29_agg.py agregace informací z datové řady: metoda agg https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries29_agg.py
70 series30_agg.py použití jmen funkcí namísto jejich referencí: metoda agg https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries30_agg.py
71 series31_aggregate.py agregace informací z datové řady: metoda aggregate https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries31_aggregate.py
72 series32_aggregate.py použití jmen funkcí namísto jejich referencí: metoda aggregate https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries32_aggregate.py
73 series33_combine.py kombinace údajů ze dvou datových řad, popř. datové řady a skalární hodnoty https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries33_combine.py
74 series34_mask.py výběr hodnot na základě zadané podmínky metodou mask https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries34_mask.py
75 series35_mask_inplace_true.py vliv nepovinného parametru inplace na metodu mask https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries35_mask_inplace_true.py
76 series36_mask_inplace_false.py vliv nepovinného parametru inplace na metodu mask https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries36_mask_inplace_false­.py 
77 series37_where.py výběr hodnot na základě zadané podmínky metodou where https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries37_where.py
78 series38_where_inplace_true.py vliv nepovinného parametru inplace na metodu where https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries38_where_inplace_true­.py
79 series39_where_inplace_false.py vliv nepovinného parametru inplace na metodu where https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries39_where_inplace_false­.py
80 series40_where_drop.py skutečná filtrace dat kombinující wheredropna https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries40_where_drop.py
81 series41_mask_drop.py alternativní způsob založený na kombinaci maskdropna https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries41_mask_drop.py
82 series42_group_by.py jedna z variant metody groupby aplikovaná na datovou řadu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries42_group_by.py
       
83 series_items.py iterace přes všechny prvky datové řady založená na metodě items https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries_items.py
84 series_iteritems.py iterace přes všechny prvky datové řady založená na metodě iteritems https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/se­ries_iteritems.py
       
85 data_frame01_loading.py načtení datového rámce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame01_loading.py
86 data_frame02_map_conversion.py postupná aplikace vybrané funkce na všechny prvky sloupce datového rámce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame02_map_conversion­.py
87 data_frame03_map_conversion.py postupná aplikace vybrané funkce na všechny prvky sloupce datového rámce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame03_map_conversion­.py
88 data_frame04_map_format.py naformátování sloupce v datovém rámci https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame04_map_format.py
89 data_frame05_transform_conversion.py transformace dat ve sloupci datového rámce s využitím metody transform https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame05_transform_conver­sion.py
90 data_frame06_transform_conversion.py transformace dat ve sloupci datového rámce s využitím metody transform https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame06_transform_conver­sion.py
91 data_frame07_transform_format.py naformátování sloupce v datovém rámci https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame07_transform_format­.py
92 data_frame08_aggregate.py agregace informací ze sloupce datového rámce: metoda aggregate https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame08_aggregate.py
93 data_frame09_aggregate.py použití jmen funkcí namísto jejich referencí: metoda aggregate https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame09_aggregate.py
94 data_frame10_combine.py kombinace údajů ze dvou sloupců datových rámců, popř. datové řady a skalární hodnoty https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame10_combine.py
95 data_frame_append.py připojení druhého datového rámce k rámci prvnímu metodou append https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_append.py
96 data_frame_concat_by_columns.py spojení dvou datových rámců po sloupcích funkcí concat https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_concat_by_columns­.py
97 data_frame_concat_by_rows.py spojení dvou datových rámců po řádcích funkcí concat https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_concat_by_rows.py
98 data_frame_join01_inner_join.py inner join (vnitřní spojení) založený na metodě join https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_join01_inner_join­.py
99 data_frame_join02_left_join.py left join (vnější spojení „zleva“) založený na metodě join https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_join02_left_join­.py
100 data_frame_join03_right_join.py right join (vnější spojení „zprava“) založený na metodě join https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_join03_right_join­.py
101 data_frame_join04_outer_join.py outer join (vnější spojení) založený na metodě join https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_join04_outer_join­.py
102 data_frame_merge01_inner_join.py inner join (vnitřní spojení) založený na funkci merge https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_merge01_inner_jo­in.py
103 data_frame_merge02_inner_jo­in_ignore_indexes.py ignorování indexů při spojování datových rámců funkcí merge https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_merge02_inner_jo­in_ignore_indexes.py
104 data_frame_merge03_inner_jo­in_use_indexes.py použití indexů při spojování datových rámců funkcí merge https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_merge03_inner_jo­in_use_indexes.py
105 data_frame_merge04_inner_jo­in_use_indexes.py použití indexů při spojování datových rámců funkcí merge https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_merge04_inner_jo­in_use_indexes.py
106 data_frame_merge05_left_join.py left join (vnější spojení „zleva“) založený na funkci merge https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_merge05_left_join­.py
107 data_frame_merge06_right_join.py right join (vnější spojení „zprava“) založený na funkci merge https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_merge06_right_jo­in.py
108 data_frame_merge07_outer_join.py outer join (vnější spojení) založený na funkci merge https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_merge07_outer_jo­in.py
       
109 data_frame_group_by01_load.py načtení tabulky do datového rámce https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_group_by01_load.py
110 data_frame_group_by02_language.py rozdělení záznamů podle jména jazyka https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_group_by02_langu­age.py
111 data_frame_group_by03_try_to_sort.py pokus o seřazení záznamů https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_group_by03_try_to_sor­t.py
112 data_frame_group_by04_lan­guage_sorted.py přejmenování sloupce se seřazením záznamů https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_group_by04_langu­age_sorted.py 
113 data_frame_group_by05_des­cending_order.py opačné řazení záznamů v datovém rámci https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_group_by05_descen­ding_order.py
114 data_frame_group_by06_view.py zobrazení záznamů rozdělených do skupin https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_group_by06_view.py
       
115 data_frame_tabulate_default.py naformátování tabulky pro zobrazení na terminálu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_tabulate_default­.py
116 data_frame_tabulate_pretty.py formát tabulky nazvaný „pretty“ https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_tabulate_pretty.py
117 data_frame_tabulate_psql.py formát tabulky shodný s klientem psql https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_tabulate_psql.py
118 data_frame_tabulate_styles.py styly formátu tabulky https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_tabulate_styles.py
119 data_frame_tabulate_styles_al­ternative.py styly formátu tabulky https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_tabulate_styles_al­ternative.py
120 data_frame_to_markdown.py tisk datového rámce do formátu kompatibilního s nástroji pro Markdown https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/da­ta_frame_to_markdown.py

Některé demonstrační příklady načítají následující soubory s daty:

# Datový soubor Stručný popis souboru Cesta
1 integer_values.csv dvousloupcová tabulka s celými čísly https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/in­teger_values.csv
2 missing_integer_values.csv dvousloupcová tabulka s celými čísly, z nichž některé chybí https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/mis­sing_integer_values.csv
3 timestamps.csv tabulka s časovými údaji https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/timestamps.csv
4 custom_timestamps.csv tabulka s časovými údaji používajícími nestandardní formát https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/cus­tom_timestamps.csv
5 denni_kurz.txt semistrukturovaný soubor s nestandardními oddělovači https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/denni_kurz.txt
6 tiobe.tsv data získaná ze stránek Tiobe indexu ve formátu TSV https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobe.tsv
7 tiobe.txt data získaná ze stránek Tiobe indexu v textovém formátu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobe.txt
8 benchmarks1.tsv výsledky benchmarků několika implementací Pythonu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/ben­chmarks1.tsv
9 benchmarks2.tsv výsledky benchmarků několika implementací Pythonu https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/ben­chmarks2.tsv
       
10 tiobeA.tsv tabulka z tiobe.tsv, ovšem pět řádků bylo odstraněno https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobeA.tsv
11 tiobeB.tsv tabulka z tiobe.tsv, ovšem pět (jiných) řádků bylo odstraněno https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobeB.tsv
12 tiobeC.tsv prvních deset řádků z tabulky „tiobe.tsv“ https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobeC.tsv
13 tiobeD.tsv posledních deset řádků z tabulky „tiobe.tsv“ https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobeD.tsv
14 tiobeE.tsv tři sloupce z tabulky „tiobe.tsv“ https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobeE.tsv
15 tiobeF.tsv čtyři sloupce z tabulky „tiobe.tsv“ https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/tiobeF.tsv
       
16 hall_of_fame.tsv vítězné jazyky za období 2003–2019 https://github.com/tisnik/most-popular-python-libs/blob/master/pandas/ha­ll_of_fame.tsv

19. Odkazy na předchozí části seriálu o knihovně Pandas

  1. Knihovna Pandas: základy práce s datovými rámci
    https://www.root.cz/clanky/knihovna-pandas-zaklady-prace-s-datovymi-ramci/
  2. Knihovna Pandas: zobrazení obsahu datových rámců, vykreslení grafů a validace dat
    https://www.root.cz/clanky/knihovna-pandas-zobrazeni-obsahu-datovych-ramcu-vykresleni-grafu-a-validace-dat/
  3. Knihovna Pandas: práce s datovými řadami (series)
    https://www.root.cz/clanky/knihovna-pandas-prace-s-datovymi-radami-series/
  4. Knihovna Pandas: pokročilejší práce s datovými řadami (series)
    https://www.root.cz/clanky/knihovna-pandas-pokrocilejsi-prace-s-datovymi-radami-series/
  5. Knihovna Pandas: spojování datových rámců s využitím append, concat, merge a join
    https://www.root.cz/clanky/knihovna-pandas-spojovani-datovych-ramcu-s-vyuzitim-append-concat-merge-a-join/

20. Odkazy na Internetu

  1. Combining Data in Pandas With merge(), .join(), and concat()
    https://realpython.com/pandas-merge-join-and-concat/
  2. Repositář python-tabulate na GitHubu
    https://github.com/astanin/python-tabulate
  3. python-tabulate na PyPi
    https://pypi.org/project/tabulate/
  4. Understanding Pandas groupby() function
    https://www.askpython.com/python-modules/pandas/pandas-groupby-function
  5. Python Pandas – GroupBy
    https://www.tutorialspoin­t.com/python_pandas/python_pan­das_groupby.htm
  6. Pandas GroupBy: Group Data in Python
    https://pythonspot.com/pandas-groupby/
  7. JOIN
    https://cs.wikipedia.org/wiki/JOIN
  8. Plotting with matplotlib
    https://pandas.pydata.org/pandas-docs/version/0.13/visualization.html
  9. Plot With Pandas: Python Data Visualization for Beginners
    https://realpython.com/pandas-plot-python/
  10. Pandas Dataframe: Plot Examples with Matplotlib and Pyplot
    https://queirozf.com/entries/pandas-dataframe-plot-examples-with-matplotlib-pyplot
  11. Opulent-Pandas na PyPi
    https://pypi.org/project/opulent-pandas/
  12. pandas_validator na PyPi
    https://pypi.org/project/pan­das_validator/
  13. pandas-validator (dokumentace)
    https://pandas-validator.readthedocs.io/en/latest/
  14. 7 Best Python Libraries for Validating Data
    https://www.yeahhub.com/7-best-python-libraries-validating-data/
  15. Universally unique identifier (Wikipedia)
    https://en.wikipedia.org/wi­ki/Universally_unique_iden­tifier
  16. Nullable integer data type
    https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html
  17. pandas.read_csv
    https://pandas.pydata.org/pandas-docs/stable/reference/api/pan­das.read_csv.html
  18. How to define format when using pandas to_datetime?
    https://stackoverflow.com/qu­estions/36848514/how-to-define-format-when-using-pandas-to-datetime
  19. Pandas : skip rows while reading csv file to a Dataframe using read_csv() in Python
    https://thispointer.com/pandas-skip-rows-while-reading-csv-file-to-a-dataframe-using-read_csv-in-python/
  20. Skip rows during csv import pandas
    https://stackoverflow.com/qu­estions/20637439/skip-rows-during-csv-import-pandas
  21. Denni kurz
    https://www.cnb.cz/cs/finan­cni_trhy/devizovy_trh/kur­zy_devizoveho_trhu/denni_kur­z.txt
  22. UUID objects according to RFC 4122 (knihovna pro Python)
    https://docs.python.org/3­.5/library/uuid.html#uuid­.uuid4
  23. Object identifier (Wikipedia)
    https://en.wikipedia.org/wi­ki/Object_identifier
  24. Digital object identifier (Wikipedia)
    https://en.wikipedia.org/wi­ki/Digital_object_identifi­er
  25. voluptuous na (na PyPi)
    https://pypi.python.org/py­pi/voluptuous
  26. Repositář knihovny voluptuous na GitHubu
    https://github.com/alectho­mas/voluptuous
  27. pytest-voluptuous 1.0.2 (na PyPi)
    https://pypi.org/project/pytest-voluptuous/
  28. pytest-voluptuous (na GitHubu)
    https://github.com/F-Secure/pytest-voluptuous
  29. schemagic 0.9.1 (na PyPi)
    https://pypi.python.org/py­pi/schemagic/0.9.1
  30. Schemagic / Schemagic.web (na GitHubu)
    https://github.com/Mechrop­hile/schemagic
  31. schema 0.6.7 (na PyPi)
    https://pypi.python.org/pypi/schema
  32. schema (na GitHubu)
    https://github.com/keleshev/schema
  33. XML Schema validator and data conversion library for Python
    https://github.com/brunato/xmlschema
  34. xmlschema 0.9.7
    https://pypi.python.org/py­pi/xmlschema/0.9.7
  35. jsonschema 2.6.0
    https://pypi.python.org/py­pi/jsonschema
  36. warlock 1.3.0
    https://pypi.python.org/pypi/warlock
  37. Python Virtual Environments – A Primer
    https://realpython.com/python-virtual-environments-a-primer/
  38. pip 1.1 documentation: Requirements files
    https://pip.readthedocs.i­o/en/1.1/requirements.html
  39. unittest.mock — mock object library
    https://docs.python.org/3­.5/library/unittest.mock.html
  40. mock 2.0.0
    https://pypi.python.org/pypi/mock
  41. An Introduction to Mocking in Python
    https://www.toptal.com/python/an-introduction-to-mocking-in-python
  42. Unit testing (Wikipedia)
    https://en.wikipedia.org/wi­ki/Unit_testing
  43. Unit testing
    https://cs.wikipedia.org/wi­ki/Unit_testing
  44. Test-driven development (Wikipedia)
    https://en.wikipedia.org/wiki/Test-driven_development
  45. Pip (dokumentace)
    https://pip.pypa.io/en/stable/
  46. 5 Differences between clojure.spec and Schema
    https://lispcast.com/clojure.spec-vs-schema/
  47. Schema: Clojure(Script) library for declarative data description and validation
    https://github.com/plumatic/schema
  48. clojure.spec – Rationale and Overview
    https://clojure.org/about/spec

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.