Programování

Pandas pro začátečníky: analýza dat z CSV a Excelu v Pythonu

Základy knihovny pandas – načtení CSV a Excelu, filtrování dat, groupby, chybějící hodnoty, spojování tabulek a export. Na praktickém příkladu.

12. 10. 2026 · 4 min čtení

Pandas je knihovna pro práci s tabulkovými daty. Co v Excelu děláte klikáním – filtry, kontingenční tabulky, SVYHLEDAT – v pandas napíšete na pár řádků a zopakujete na libovolném množství souborů. Projdeme si to na příkladu prodejů e-shopu.

Instalace

pip install pandas openpyxl

openpyxl je potřeba pro čtení a zápis .xlsx.

Načtení dat

Mějme prodeje.csv:

datum;produkt;kategorie;mnozstvi;cena
2026-01-03;Hrnek;Domácnost;2;149,90
2026-01-03;Tričko;Oblečení;1;399,00
2026-01-04;Hrnek;Domácnost;5;149,90

České CSV z Excelu mívají středník a desetinnou čárku:

import pandas as pd

df = pd.read_csv(
    "prodeje.csv",
    sep=";",
    decimal=",",
    parse_dates=["datum"],
    encoding="utf-8",       # u starších exportů zkuste "cp1250"
)

Excel:

df = pd.read_excel("prodeje.xlsx", sheet_name="List1")

První pohled na data

df.head()        # prvních 5 řádků
df.info()        # sloupce, typy, počet ne-prázdných hodnot
df.describe()    # statistiky číselných sloupců
df.shape         # (řádky, sloupce)
df["kategorie"].value_counts()

df.info() je nejdůležitější první krok: ukáže, jestli se čísla načetla jako čísla (float64, int64) a ne jako text (object).

Výběr sloupců a řádků

df["produkt"]                    # jeden sloupec (Series)
df[["produkt", "cena"]]          # více sloupců (DataFrame)
df.loc[0]                        # řádek podle indexu
df.loc[df["mnozstvi"] > 3]       # filtr
df.loc[df["mnozstvi"] > 3, ["produkt", "mnozstvi"]]

Více podmínek se spojuje & (a) a | (nebo), každá v závorkách:

df[(df["kategorie"] == "Domácnost") & (df["cena"] < 200)]
df[df["produkt"].isin(["Hrnek", "Tričko"])]
df[df["produkt"].str.contains("hr", case=False)]

Python operátory and/or tu nefungují – vyhodí ValueError: The truth value of a Series is ambiguous.

Nové sloupce

df["trzba"] = df["mnozstvi"] * df["cena"]
df["mesic"] = df["datum"].dt.to_period("M")
df["velka_objednavka"] = df["trzba"] > 500

Operace probíhají nad celým sloupcem najednou. Cyklus for přes řádky je v pandas téměř vždy zbytečný a pomalý.

Seskupování (groupby)

Ekvivalent kontingenční tabulky:

df.groupby("kategorie")["trzba"].sum()

souhrn = (
    df.groupby(["mesic", "kategorie"])
      .agg(trzba=("trzba", "sum"),
           kusu=("mnozstvi", "sum"),
           objednavek=("produkt", "count"))
      .reset_index()
      .sort_values("trzba", ascending=False)
)

Kontingenční tabulka s měsíci ve sloupcích:

pd.pivot_table(df, values="trzba", index="kategorie",
               columns="mesic", aggfunc="sum", fill_value=0)

Chybějící hodnoty

df.isna().sum()                       # kolik chybí v každém sloupci
df = df.dropna(subset=["cena"])       # zahodit řádky bez ceny
df["kategorie"] = df["kategorie"].fillna("Nezařazeno")

Spojování tabulek (SVYHLEDAT)

Máme produkty.csv s dodavateli:

produkty = pd.read_csv("produkty.csv", sep=";")
spojeno = df.merge(produkty, on="produkt", how="left")

how="left" zachová všechny prodeje, i když produkt v číselníku chybí (dostane NaN). Po spojení zkontrolujte počet řádků – pokud vzrostl, máte v číselníku duplicitní klíče. Pandas to umí hlídat: merge(..., validate="many_to_one").

Export

souhrn.to_csv("souhrn.csv", index=False, sep=";", decimal=",", encoding="utf-8-sig")
souhrn.to_excel("souhrn.xlsx", index=False)

utf-8-sig zajistí, že Excel správně zobrazí češtinu.

Více listů do jednoho souboru:

with pd.ExcelWriter("report.xlsx") as writer:
    souhrn.to_excel(writer, sheet_name="Souhrn", index=False)
    df.to_excel(writer, sheet_name="Data", index=False)

Časté pasti

  • SettingWithCopyWarning – upravujete výřez z jiné tabulky. Pokud chcete samostatnou kopii, použijte .copy(): drahe = df[df["cena"] > 300].copy(). V pandas 3.0 se chování zjednodušuje díky režimu Copy-on-Write.
  • Čísla jako text – při špatném decimal se 149,90 načte jako řetězec. Ověřte df.dtypes, případně pd.to_numeric(df["cena"].str.replace(",", ".")).
  • Datum jako text – bez parse_dates nebo pd.to_datetime nefunguje .dt ani řazení podle data. U formátu 03.01.2026 použijte pd.to_datetime(df["datum"], format="%d.%m.%Y").

Kam dál

  • Grafy: df.plot() využívá matplotlib (pip install matplotlib).
  • Velká data: pokud se soubor nevejde do paměti, podívejte se na chunksize v read_csv nebo na knihovnu Polars.

Pokud potřebujete z konkrétní tabulky dostat konkrétní přehled, přiložte ukázku CSV do ColdHost AI v režimu Programování a popište, co chcete vidět – dostanete skript, který pak spouštíte každý měsíc znovu.