Datové rámce v Pythonu - pandas, geopandas a polars

Programování v GIS 2

Jan Caha

2026-04-13

Datové rámce

  • efektivně tabulka - řádky, sloupce
  • sloupce mají jednotný datový typ (číslo, text, datum, …)
  • řádky mají stejnou strukturu
  • každý řádek představuje jeden objekt (např. jeden záznam o měření)
  • sloupce mají jména (např. název měření, datum, …)
  • geodata - sloupce se specifickým datovým typem (geometrie)
  • efektivně se jedná o komplikovanou strukturu s mnoha funkcemi a metodami, které umožňují práci s daty

Datové rámce v Pythonu

  • Python tento koncept přímo v sobě neobsahuje (na rozdíl třeba od R)
  • nejstarší podobná implementace je numpy - což jsou obecně multidimenzionální struktury, ale spíše ve smyslu matic a dalších numerických dat
  • pro práci s tabulkovými daty se používá knihovna pandas a chceme-li pracovat s geografickými daty, tak geopandas
  • v poslední době se objevují i nové knihovny, které se snaží být efektivnější a rychlejší, např. polars a geopolars

Pandas

  • závisí na řadě knihoven, poměrně “těžké”
  • z historických důvodů zde existuje na řadu problémů několik různých přístupů k řešení stejného problému může být zmatečné a komplikované na pochopení
  • chybí zcela ujednocující koncepce
  • nesmírně široké možnosti práce s daty a podpora pro mnoho formátů (platí i pro geodata)
  • práci občas stěžuje koncept indexů a jejich správa a absence jednotného přístupu k práci s daty
  • hlavní třída DataFrame - na ní řada funkcí
  • verze 3.0 (leden 2026) část problémů řeší
  • Pandas cookbook, Getting started tutorials, Pandas Tutorial: DataFrames in Python

Geopandas

  • rozšíření pandas pro prostorová data
  • třída GeoDataFrame, rozšíření DataFrame (nové funkce)
  • postaveno nad GDAL/OGR, respektive shapely a pygrio

Polars

  • modernější iterace na téma datových rámců, značně inspirovaná dplyr (balík pro R)
  • napsáno primárně pro Rust a následně portováno do mnoha dalších jazyků (včetně Pythonu)
  • mnohem rychlejší, bezpečnější a efektivnější než pandas
  • podporuje méně formátů než pandas, zejména s ohledem na udržení lehkosti (co se týká závislostí)
  • kód je mnohem čitelnější a obvykle jednodušší na pochopení v porovnání s pandas
  • user guide , Modern Polars - porovnání s pandas a polars
  • pro práci s prostorovými daty existuje balík geopolars

Ukázka - selekce

import pandas as pd

df_pd = pd.read_csv(extracted)

df_pd.loc[12:15, ["Dest", "Tail_Number"]]

selected_pd = df_pd.set_index("IATA_CODE_Reporting_Airline").loc[["AA", "DL"], ["Dest", "Tail_Number"]]

selected_pd
import polars as pl

df_pl = pl.read_csv(extracted, truncate_ragged_lines=True)

df_pl.select(["Dest", "Tail_Number"]).head(12).tail(3)

selected_pl = df_pl.filter(pl.col("IATA_CODE_Reporting_Airline").is_in(["AA", "DL"])).select(
    ["IATA_CODE_Reporting_Airline", "Dest", "Tail_Number"]
)

selected_pl

Ukázka - tvorba sloupce

df_pd["novy_sloupec"] = df_pd["sloupec_hodnota"] <= 3
df_pl = df_pl.with_columns(pl.when(pl.col("sloupec_hodnota") <= 10).then(True).otherwise(False).alias("novy_sloupec"))

Ukázka - filtrace dat

df_filtered = df_pd[(df_pd["zpozdeni"] > 15) & (df_pd["mesto"] == "Praha")]
df_filtered = df_pl.filter((pl.col("zpozdeni") > 15) & (pl.col("mesto") == "Praha"))

Ukázka - seskupování a agregace (Group by)

df_grouped_pd = df_pd.groupby("letecka_spolecnost").agg(
    prumerne_zpozdeni=("zpozdeni", "mean"), pocet_letu=("id_letu", "count")
)

df_grouped_pd
df_grouped_pl = df_pl.group_by("letecka_spolecnost").agg(
    pl.col("zpozdeni").mean().alias("prumerne_zpozdeni"), pl.col("id_letu").count().alias("pocet_letu")
)

df_grouped_pl

Konverze mezi knihovnami

  • často je nutné data mezi těmito knihovnami převádět data (např. některá jiná knihovna podporuje zatím jen pandas)
  • polars má funkce pro převod z a do pandas
import polars as pl

# vytvoření polars DataFrame z pandas DataFrame
df_pl = pl.from_pandas(df_pd)
# převod polars DataFrame na pandas DataFrame
df_pd = df_pl.to_pandas()

Dotazy?