Skip to content
czechdatasets

Czech election results 1996–2026 by municipality and polling district

Czech election results by municipality and polling district: parliamentary, Senate, European, regional, municipal and presidential elections. All in one structure, with municipality codes converted to the current ones. Since 2016 each polling district has its official code, so results go straight onto a map.

Free sample

One-time payment, final price for a personal licence, switch to business at checkout · data as of 17 October 2026

You are buying the Elections 1996–2026 + schools bundle. It also includes: Schools and school facilities.

An island with a village school with a bell tower and a wooden ballot box on a table in the schoolyardAn island with a village school with a bell tower and a wooden ballot box on a table in the schoolyard

How much work it saves

Unifying 60 elections from 31 volby.cz exports with different formats, encodings and code lists, rolling city districts up into their cities and converting historical municipality codes to RÚIAN, the Czech register of addresses, buildings, parcels and territorial units. Adding up candidates’ votes in municipal elections into candidate lists per polling district, and matching 218,335 polling districts to the RÚIAN version of the district valid on election day. Totals verified against the overall results of ČSÚ, the Czech Statistical Office: the Senate in all 977 constituencies and rounds, municipal elections for all 183,152 candidate lists.

Measured on our own build

Lines of code and tests
1,620

We measured AI agent usage on 6 other datasets: the first working version of the code took 10m to 40m tokens and 21–62 mins of agent run time.

  • Free sample: all tables cut down to the Kutná Hora area, in CSV and Parquet. Download the sample
Data as of
17 October 2026
Rows
8.8m
Tables
18
Formats
PostgreSQL, Parquet, CSV, JSON
Source licence
CC BY 4.0 (ČSÚ, ČÚZK)

What’s inside

Results of elections for the Chamber of Deputies (2002–2025), the Senate (1996–2026 including by-elections, both rounds), the president (2013–2023, both rounds), the European Parliament (2004–2024), regional councils (2000–2024) and municipal councils (2002–2026), by municipality and polling district in a uniform structure, with municipality codes converted to RÚIAN and with the RÚIAN polling district code for elections since 2016.

TableRows
volbyList of the elections included60
stranyParties standing (PS = Chamber of Deputies, EP = European Parliament, KZ = regional councils) and presidential candidates, with their ballot number900
volebni_stranyČSÚ code list of electoral parties (CVS), unified across all the elections included; the latest name applies1,719
vysledky_obceSummary results by municipality (PS, president, EP, KZ). City districts are summed up for the whole city156,307
vysledky_obce_stranyVotes for parties / candidates in municipalities (long format; rows with 0 votes left out)1,706,616
vysledky_okrskySummary results by polling district (PS, president, EP, KZ)362,688
vysledky_okrsky_stranyVotes for parties / candidates in polling districts (long format; rows with 0 votes left out)3,966,767
kv_zastupitelstvaElections to the councils of municipalities, city districts and the City of Prague: summary per council and constituency (regular date)44,792
kv_kandidatkyResults of candidate lists in elections to municipal councils (regular date)183,152
kv_okrskyMunicipal elections by polling district: turnout in the district for each council elected there (in cities divided into districts, two rows per polling district: the city council and the city district council)118,017
Show all 18 tables
TableRows
kv_okrsky_kandidatkyMunicipal elections by polling district: votes for candidate lists (the sum of votes for the list’s candidates; rows with 0 votes left out)907,074
senat_obvodySenate elections: summary per constituency and round (regular elections, by-elections and repeat elections 1996–2026)977
senat_kandidatiSenate elections: candidates in constituencies with the result of both rounds (name, titles, electoral and nominating party; without age, occupation and place of residence)3,698
senat_obceSenate elections: summary per municipality within a constituency and per round. City districts are summed up for the city; a city split between several constituencies has a row for each75,537
senat_obce_kandidatiSenate elections: votes for candidates in municipalities (long format; rows with 0 votes left out)323,002
senat_okrskySenate elections: summary per polling district and round177,982
senat_okrsky_kandidatiSenate elections: votes for candidates in polling districts (long format; rows with 0 votes left out)782,695
obce_mapovaniMapping of municipality and city district codes from the election data to RÚIAN municipalities 2026-096,427

Elections since October 2016 have the RÚIAN polling district code; the district boundaries are in the RÚIAN dataset. Names are given only for presidential and Senate candidates; lists of independent candidates in municipal elections have a generic name.

Downloads

Every format contains the same data. Download only the one you need; verify its integrity with the SHA256SUMS file.

FormatFilesSize
PostgreSQLschema.sql with types, keys, indexes and comments, and import.sh, which loads the data from CSV241 kB
ParquetOne file per table (zstd). DuckDB, Polars and pandas read it without an import.1840 MB
CSVUTF-8, comma-separated, with a header; large tables as .csv.gz18118 MB
JSONAn array of objects; large tables as JSON Lines (.jsonl.gz)18322 MB

Code example

More examples for SQL, DuckDB, Python and Node.js are in the README.md inside the bundle.

Senators elected in 2026DuckDB
-- senátoři zvolení v roce 2026 s výsledkem obou kol
SELECT o.obvod, o.obvod_nazev, k.jmeno, k.prijmeni, k.strana_zkratka, k.pct_kolo1, k.pct_kolo2
FROM 'parquet/senat_kandidati.parquet' k
JOIN 'parquet/senat_obvody.parquet' o ON o.volba_id = k.volba_id AND o.obvod = k.obvod AND o.kolo = 1
WHERE k.volba_id = 'se2026' AND k.zvolen ORDER BY o.obvod;
Polling district map with boundaries from RÚIANDuckDB
-- mapa okrsků: podíl vítěze 2. kola senátních voleb 2026 s hranicemi ze sady ruian (dnešní stav)
SELECT o.obvod, o.volebni_okrsek_kod, o.ucast_pct, round(100.0 * h.hlasy / o.platne_hlasy, 2) AS pct_viteze, r.hranice
FROM 'parquet/senat_okrsky.parquet' o
JOIN 'parquet/senat_okrsky_kandidati.parquet' h
  ON h.volba_id = o.volba_id AND h.kolo = o.kolo AND h.uzemi_kod = o.uzemi_kod AND h.okrsek = o.okrsek
JOIN 'parquet/senat_kandidati.parquet' k
  ON k.volba_id = h.volba_id AND k.obvod = h.obvod AND k.kandidat_kod = h.kandidat_kod
JOIN 'ruian/parquet/volebni_okrsky.parquet' r ON r.kod = o.volebni_okrsek_kod
WHERE o.volba_id = 'se2026' AND o.kolo = 2 AND k.zvolen;
Turnout in round 2 of the 2023 presidential electionDuckDB
-- účast v 2. kole prezidentské volby 2023 podle krajů
SELECT kraj_kod, round(100.0 * sum(vydane_obalky) / sum(volici_v_seznamu), 2) AS ucast
FROM 'parquet/vysledky_obce.parquet' WHERE volba_id = 'prez2023' AND kolo = 2 AND NOT zahranici
GROUP BY 1 ORDER BY 2 DESC;
Municipal elections in Brno by polling districtPostgreSQL
-- nejsilnější kandidátka v každém okrsku: zastupitelstvo města Brna 2026
SELECT DISTINCT ON (h.okrsek) h.okrsek, h.volebni_okrsek_kod, k.nazev, h.hlasy
FROM volby.kv_okrsky_kandidatky h
JOIN volby.kv_kandidatky k USING (volba_id, zastupitelstvo_kod, obvod, strana_kod)
WHERE h.volba_id = 'kv2026' AND h.zastupitelstvo_kod = 582786
ORDER BY h.okrsek, h.hlasy DESC;

Source and licence

Sources
Processed by
czechdatasets.com. The data is modified and is not an official output of the authority; the required attribution is in LICENCE.txt.

Elections 1996–2026 + schools for 390 CZK.

One-time payment, download right after paying, no account and no subscription. Updates to the dataset are included in the price. All 15 paid datasets together cost 2,490 CZK, 3,510 CZK less than buying them one by one.