US County Election Results

Open dataset · v1.0.0 · CC BY 4.0

County-level U.S. election results: House, Senate and President, 1990–2024

Free, documented county-level election data for the United States: every regular U.S. House general election by county since 1990, plus Senate and presidential results. Each row gives the candidate, party and votes in one county, and says where the numbers came from.

Download all files (zip, 9.5 MB) Explore the map Zenodo · DOI
Map of the 48 contiguous states shaded by county: the Democratic share of the two-party vote for U.S. House in 2024, from deep red to deep blue.
U.S. House, 2024: Democratic share of the two-party vote in each county. Republican Democratic Unopposed seat, not on the ballot No data Solid blocks are uncontested races. The interactive map covers every year and office, with candidate names on hover.

At a glance

54,939House county-years, 1990–2024
37,283Senate county-years, 1990–2024
27,969Presidential county-years, 1992–2024
1,523documented sources

Download

Files are attached to the GitHub Release and archived on Zenodo. Column definitions are in DATA_DICTIONARY.md.

FileContentsSize
us_county_results_long.csv
.parquet
One row per year × office × county × district × candidate × party line: candidate, party, party group, votes, source, quality flag46 MB
3 MB
us_county_results_summary.csv One row per year × office × county: Democratic, Republican, other and total votes; two-party and total shares12 MB
us_county_results_gaps.csv Every state-year-office not fully covered, with the reason5 KB
us_county_results_no_ballot.csv House seats whose unopposed winner was not on the ballot (FL, LA, OK) or not tabulated (AR), by county133 KB
SOURCES.csv Every source: publisher, document, locator, transcription method, license terms1.7 MB
data_corrections_log.csv Every error found in the sources and how it was handled109 KB

Quick start

Read FIPS codes and districts as text so leading zeros survive.

# R
library(readr)
url  <- "https://github.com/pmheideman/us-county-election-results/releases/download/v1.0.0/us_county_results_summary.csv"
cty  <- read_csv(url, col_types = cols(.default = col_character()))
house_2024 <- subset(cty, office == "house" & year == "2024")
# Python
import pandas as pd
url = "https://github.com/pmheideman/us-county-election-results/releases/download/v1.0.0/us_county_results_long.parquet"
long = pd.read_parquet(url)   # year and votes are integers; FIPS codes are strings
senate = long.query("office == 'senate' and year >= 2016")

Coverage

OfficeYearsCounty-yearsCandidate detail
U.S. House1990–202454,939Every candidate, per district
President1992–202427,969Every candidate from 2000; the two major-party nominees before that
U.S. Senate1990–202437,283Every candidate from 2016; the two major-party nominees before that

48 contiguous states; Alaska, Hawaii and DC are not included. Regular general elections only (Louisiana and Texas runoffs are included where they decided the seat); special elections are excluded. Counties use 5-digit FIPS codes.

Frequently asked questions

Where can I download county-level U.S. House election results?

Here. This dataset has county-level results for every regular U.S. House general election from 1990 to 2024 in the 48 contiguous states, with candidate names, parties and votes. It's free under CC BY 4.0. Use the download links above or the Zenodo record.

How are counties split between congressional districts handled?

The long file has one row per county, district and candidate, so a county split between three districts appears three times, once per district. The summary file adds these up to one row per county and year, with the number of districts in n_districts.

How is this different from MEDSL, OpenElections or Dave Leip's Atlas?

MEDSL's county presidential file starts in 2000, and its House and Senate precinct files start in 2016. OpenElections is volunteer-built, so coverage varies by state and year. Leip's Atlas sells its data. This dataset starts from those open sources and fills the rest from official state reports and canvasses to reach back to 1990. Errors found along the way are corrected and logged, and every row says which source it came from.

Can I get vote shares instead of raw votes?

Yes. us_county_results_summary.csv has Democratic, Republican, other and total votes, the Democratic two-party share (D ÷ (D + R)) and the Republican share of all votes, for every county, office and year.

Why are some counties blank for the House?

Mostly because the seat was won unopposed. Florida, Louisiana and Oklahoma leave unopposed candidates off the ballot, and Arkansas doesn't count their votes, so no county returns exist. These are listed in us_county_results_no_ballot.csv. Six state-years have no county-level source found yet; they're listed in us_county_results_gaps.csv.

Is the data free to use, including commercially?

Yes. The compiled data is licensed CC BY 4.0: use it for anything, with credit. Vote counts are public records, but a few state websites publish results under their own terms. The license columns of SOURCES.csv list them.

How accurate is it?

State totals are checked against the FEC's certified results and the states' own canvasses. For President (2000–2024), 648 of 658 state-level nominee totals match the certified figures within 0.5%. House and Senate results (2004–2022) are compared with the FEC district by district and state by state. Known remaining problems are listed in the corrections log and flagged row by row in quality_flag.

Cite

Heideman, Paul (2026). U.S. county-level election results: President, U.S. House and U.S. Senate, 1990–2024 (v1.0.0) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.22976553

Please also cite the upstream sources you rely on (listed in SOURCES.csv). The code that builds the dataset is on GitHub under the MIT license. Design and data decisions are documented in DECISIONS.md, and changes between releases in the changelog.