Where our data comes from
EPA Map of Radon Zones (county_radon_zone.csv)
- URL: https://www.epa.gov/radon/epa-map-radon-zones-and-supplemental-information. The data file is https://www.epa.gov/sites/default/files/2020-03/radon_zones-spreadsheet.xls (EPA 402/A-16/001), downloaded 2026-10-31.
- License and terms: U.S. federal government work, public domain in the United States.
- Citation: U.S. Environmental Protection Agency. EPA Map of Radon Zones (EPA-402-R-93-071, 1993), county zone spreadsheet. Accessed October 31, 2026.
- Method: The spreadsheet lists counties by name with no FIPS codes. build/fetch_radon.py joins it on state and county name to the Census 2020 county code file (https://www2.census.gov/geo/docs/reference/codes2020/national_county2020.txt). Virginia independent cities are relabeled to Census style ("Alexandria city"). Counties that changed after 1993 are mapped by hand: Wade Hampton to Kusilvak, Shannon to Oglala Lakota, Dade to Miami-Dade, LaSalle spelling, and Alaska census areas that later split pass their zone to each successor (Skagway and Hoonah-Angoon, Wrangell and Petersburg, Chugach and Copper River). Former Virginia cities (Bedford, Clifton Forge, South Boston) and Yellowstone National Park are dropped. All 3,143 counties and county equivalents in the 50 states and DC get a zone.
- Caveats: The zones date from 1993 and are a county average from geology, aerial radioactivity, soil and limited indoor test data. EPA says they are not meant to predict the radon level in any one home and that every home should be tested. Zone 1 means a predicted average indoor level above 4 pCi/L, Zone 2 is 2 to 4 pCi/L, Zone 3 is below 2 pCi/L. Several states (for example New Jersey and California) publish finer state maps that can disagree with the EPA county zone. Connecticut's 2022 switch from counties to planning regions is not reflected; rows use the 2020 Connecticut county FIPS codes (09001 to 09015).
EPA UCMR 5 PFAS occurrence data (county_pfas_public_systems.csv)
- URL: https://www.epa.gov/dwucmr/occurrence-data-unregulated-contaminant-monitoring-rule. Bulk file https://www.epa.gov/system/files/other-files/2023-08/ucmr5-occurrence-data.zip (UCMR5_All.txt). EPA says the complete UCMR 5 dataset was released in August 2026; the zip we used was last modified October 15, 2026, and carries the July 2026 data summary. Downloaded 2026-10-31.
- County join: ECHO SDWA bulk download, https://echo.epa.gov/files/echodownloads/SDWA_latest_downloads.zip, file SDWA_GEOGRAPHIC_AREAS.csv (SDWIS 2026 Q3 submission, file dated October 13, 2026). Only the geographic areas file is kept.
- License and terms: U.S. federal government works, public domain in the United States.
- Citation: U.S. Environmental Protection Agency. Fifth Unregulated Contaminant Monitoring Rule (UCMR 5) Occurrence Data, 2023 to 2025. Accessed October 31, 2026. U.S. EPA ECHO, Safe Drinking Water Act data download, accessed October 31, 2026.
- Method (build/fetch_pfas.py): A system counts as tested if it has any UCMR 5 PFAS result. Detected means any of the 29 UCMR 5 PFAS was reported at or above the minimum reporting level. Over MCL means at least one single PFOA or PFOS sample above 4.0 ng/L. Max values are the highest single PFOA and PFOS results in the county, converted from micrograms per liter to ng/L, and are blank when nothing was reported at or above the reporting level. Lithium is excluded. Systems are placed in counties using SDWIS rows of area type CN (county served); a system that serves several counties is counted in each one. A few retired county codes are mapped to current FIPS (for example Dade to Miami-Dade, Valdez-Cordova to its two successors).
- Coverage: 10,312 systems have UCMR 5 results; 10,152 map to at least one county; 160 have no usable county row and are left out (about 100 tribal systems, about 40 Virginia systems that report no county, and a few with retired or invalid codes). The file covers 2,583 counties.
- Caveats: These are public water systems, not private wells. UCMR 5 covers all community and nontransient noncommunity systems serving more than 3,300 people plus a representative sample of smaller systems, so rural counties may show few or no systems. The over-MCL flag is a screening count from single samples. The 2024 PFAS rule judges compliance on a running annual average, with a compliance date set in the rule, so a system flagged here is not necessarily in violation. A county with zero detections can still have contaminated private wells.
State private well programs (state_well_programs.json)
- URLs: One record per state plus DC, each pointing to official state agency pages (.gov or state-run domains such as wadsworth.org for the New York State Department of Health lab program and oehs.wvdhhr.org for West Virginia) or state university extension and geological survey pages. The source URL for each fact is the field it sits in or is named in notes.
- License and terms: State government web pages. Most states place their content in the public domain or allow reuse with attribution, but terms vary by state, so we store links and short factual notes, not copied text.
- Citation: Cite the state agency named in the agency field and the page URL, with the verified_at date.
- Method: Pages were found by web search in October 2026 and every URL was checked with curl (build/fetch_state_programs.py re-checks them and stamps verified_at). Notes on free testing and required testing were taken from the official page or, for New Jersey and Maryland, from the statute text.
- Caveats: 23 URLs return HTTP 403 to automated requests because the state host blocks bots (Alaska, Arkansas, Colorado, Florida, Kansas, Louisiana, Maine, Massachusetts, New Hampshire, New York, Rhode Island, Tennessee, Utah). Each was confirmed through a browser-style fetch or a 2026 Wayback Machine capture, and the record's notes say which. New Jersey's dep.nj.gov pages return 200 but serve a bot-check page, so their content was not read directly. Fields we could not confirm are null rather than guessed, so a null free_or_subsidized_testing or new_well_testing_required means we found no official statement, not that the program does not exist. Several states leave testing rules to counties or towns, which this file does not cover. DC has no private drinking water well program, so its fields are null. State pages move often; rerun the URL check before publishing.
EPA estimates of private well use, 2020 (county_domestic_wells.csv)
- Name: United States Estimated Water Sources - 2020 Census Blocks, U.S. EPA Office of Research and Development.
- URL: https://doi.org/10.23719/1531806 (data.gov record https://catalog.data.gov/dataset/united-states-estimated-water-sources-2020-census-blocks, last updated 2024-11-01). Files and code at https://github.com/USEPA/ORD_Water_Source_2020. We use outputs/Well_Estimates_2020_Blocks.csv (755 MB, stored with Git LFS), downloaded 2026-10-31.
- License and terms: EPA Science Hub license, https://pasteur.epa.gov/license/sciencehub-license-non-epa-generated.html. EPA work is public domain in the United States. EPA asks that the figures be treated as estimates, not exact counts of well or public water users.
- Citation: U.S. EPA Office of Research and Development, 2024, United States Estimated Water Sources - 2020 Census Blocks, https://doi.org/10.23719/1531806. Method paper: Murray, A., Hall, A., Weaver, J., and Kremer, F., 2021, Methods for estimating locations of housing units served by private domestic wells in the United States applied to 2010, Journal of the American Water Resources Association, https://doi.org/10.1111/1752-1688.12937.
- Method (EPA): every 2020 census block is classed as public or private water with a decision tree built on 1990 census sewer and water hookups, impervious surface and other predictors, then adjusted with EPA's community water system service area boundaries. Pop_Wells is the estimated number of people in the block on a private supply.
- Method (ours): build/fetch_well_population.py sums Pop_Wells and Population from the block file to counties by State_Fips + County_Fips, caches that county table as data/raw/epa_wells_2020_county.csv, and deletes the block file. County names come from the Census 2020 national county list. domestic_selfsupplied_pop is the summed Pop_Wells, total_pop is the 2020 census population, pct_selfsupplied is one over the other, and year is 2020. The output has 3,143 rows covering the 50 states and DC; EPA has no estimates for Puerto Rico or the other territories, so they are dropped. The national total is about 45.8 million people.
- Comparison column: usgs2015_selfsupplied_pop holds the USGS 2015 self-supplied domestic population (DO-SSPop) from Dieter et al., 2018, Estimated use of water in the United States county-level data for 2015 (ver. 2.0), https://doi.org/10.5066/F7TB15V5. It is blank for the two Alaska census areas (02063, 02066) created after 2015.
- Why we dropped the USGS 2015 figure: in most states it is a residual, total population minus the population that public suppliers report serving. Where supplier counts are low or missing, the gap lands in the self-supplied column. That put 265,000 people on private wells in Erie County NY, 277,000 in Prince George's County MD and 241,000 in Monroe County NY. EPA's 2020 block estimates give 33,000, 36,000 and 6,000.
- Caveats: these are modeled block classifications, so a block is mostly all public or all private and edge areas can be wrong in either direction. EPA's README notes that Well_Estimates_2020_Blocks.csv, the version with community water system service areas, was still described as undergoing testing; the older file (Well_Estimates_2020_Blks_OLD.csv) lacks them. Counties use 2020 boundaries, so Connecticut appears as its 8 old counties and Alaska includes Chugach and Copper River census areas. The summed 2020 population is about 27,500 below the official census count of 331,449,281.
United States Groundwater Well Database (county_well_depths.csv)
- URL: https://www.hydroshare.org/resource/8b02895f02c14dd1a749bcc5584a5c55/ (DOI https://doi.org/10.4211/hs.8b02895f02c14dd1a749bcc5584a5c55). We use the 50 state CSV files in USGWD-Tabular, downloaded 2026-10-31. The paper describing it is at https://doi.org/10.1038/s41597-024-03186-3.
- License and terms: Creative Commons Attribution 4.0 (CC BY 4.0). We must credit the authors and link the license. Some states attach their own disclaimers, listed in Table S2 of the resource's Metadata folder.
- Citation: Lin, C.-Y., Miller, A., Waqar, M., and Marston, L. T. (2024). A database of groundwater wells in the United States. Scientific Data, 11, 335. https://doi.org/10.1038/s41597-024-03186-3. Dataset: Lin, C.-Y., Miller, A., Waqar, M., and Marston, L. (2024). A Database of Groundwater Wells in the United States [Dataset]. HydroShare. https://doi.org/10.4211/hs.8b02895f02c14dd1a749bcc5584a5c55.
- Fields used: FIPS, County, Well Depth (Feet), USGS Water Use Category, Flag US, Flag Duplicate, Well ID (State), Longitude, Latitude.
- Method: build/fetch_usgwd_depths.py downloads each state file, keeps a small extract in data/raw/usgwd/extract/, and deletes the full CSV. Records with Flag US = 1 (coordinates outside the U.S.) are dropped. Records flagged as duplicates (Flag Duplicate 2 or 3) are reduced to one per state ID and coordinate pair. The database assigns FIPS from coordinates; for about 1.09 million records with FIPS "Unknown", we look up the state-reported county name in the Census 2020 county code file. Records whose FIPS falls in a different state than the source file are dropped as bad coordinates, and about 560,000 records have no usable county. Depths at or below 0 ft or above 5,000 ft are dropped (462,000 records). Monitoring wells are excluded from all depth statistics because they are shallow environmental boreholes, not water sources, so n_wells counts non-monitoring wells with a valid depth. n_domestic_wells and median_domestic_depth_ft use wells whose category starts with "Domestic". A per-state coverage table is written to data/clean/usgwd_state_coverage.csv.
- Coverage gaps: There are no depth values for Alabama, Connecticut, Hawaii, Idaho, New Hampshire, Pennsylvania, Utah or Washington, and DC has no records, so those counties have no rows. Coverage is partial in Florida (40 of 67 counties, from some water management districts only), North Carolina (17 of 100), Georgia (irrigation wells only), Rhode Island (562 wells with depth), West Virginia (228 wells) and Alaska (most records lack a usable county). The output has 2,706 counties, and 164 of them have fewer than 30 wells.
- Caveats: These are well construction records submitted to state agencies, not a census of wells. State staff estimate coverage ranging from about 8 to 30 percent (Texas) to 90 percent or more (Michigan). Water use labels come from the state data mapped to USGS categories and some are unusable: Wisconsin labels most wells "Commercial" or "Unknown" and Indiana labels most "Other", so their domestic counts are near zero even though most of their wells are household wells. New Jersey and Georgia files contain only irrigation wells. Medians from a few dozen wells should not be shown as a county figure without a sample size.
Water Quality Portal: measured groundwater quality in wells (county_well_quality.csv, state_well_quality.csv)
- URL: https://www.waterqualitydata.us. Web services used:
/data/Result/search(dataProfile=resultPhysChem, zipped CSV) and/data/Station/search, queried state by state and contaminant by contaminant withsiteType=Well,sampleMedia=Water,startDateLo=01-01-2000. Downloaded October 31 to November 1, 2026: 1,027,442 result rows from 56 states and territories, about 76 MB of parquet in data/raw/wqp/. - License and terms: The portal is run by USGS, EPA and the National Water Quality Monitoring Council. USGS and EPA data are U.S. federal government works and public domain in the United States. Data from state, tribal and local organizations submitted through EPA's WQX are provided for public use; the portal asks users to cite it and to credit the originating organization (OrganizationIdentifier is kept in the raw files).
- Citation: National Water Quality Monitoring Council, 2026, Water Quality Portal, accessed November 1, 2026, https://doi.org/10.5066/P9QRKUVJ. Underlying sources: USGS National Water Information System (NWIS) and EPA Water Quality Exchange (WQX/STORET).
- Scripts:
build/fetch_wqp_wells.pydownloads (resumable, sequential, retries, county split for very large states; raw parquet in data/raw/wqp/).build/fetch_wqp_summarize.pybuilds the tables and also writesdata/clean/wqp_well_samples.parquet(one row per well per date) anddata/clean/wqp_dropped_units.csv(results dropped because their unit could not be converted). - Characteristics: nitrate (Nitrate, Nitrate as N, Nitrate + Nitrite, Inorganic nitrogen (nitrate and nitrite) and STEWARDS variants), Arsenic, Uranium, Manganese, Lead, Fluoride, Radon-222 / Radon, Total Coliform, Escherichia coli, PFOA (Perfluorooctanoic acid, PFOA ion, Perfluorooctanoate), PFOS (Perfluorooctanesulfonate, Perfluorooctane sulfonic acid, Perfluorooctanesulfonate (PFOS)), Iron.
- Method:
- Routine samples only. QC blanks, replicates and spikes (ActivityTypeCode "Quality Control ...", plus "Field Msr/Obs" field-kit readings) and results with status "Rejected" or detection condition "Systematic Contamination" are dropped, as are summary-statistic rows.
- Groundwater only. Well sites also carry septic effluent, leachate, hyporheic, soil-moisture and finished (treated) water samples; only ActivityMediaSubdivisionName Groundwater, blank or Drinking Water is kept. Test holes, hyporheic-zone wells, extensometers and galleries are dropped. Oregon DEQ septic-effluent samples at well sites were the reason: before this filter Oregon showed 52% of "well" samples positive for E. coli.
- Units: nitrate to mg/L as N (nitrate as NO3 multiplied by 0.2259; results with no speciation are taken as "as N"); arsenic, uranium, manganese, lead and iron to ug/L; fluoride to mg/L; radon to pCi/L (Bq/L x 27.03); PFOA and PFOS to ng/L. Uranium reported as activity (pCi/L) is converted with EPA's 0.67 pCi/ug factor for natural uranium.
- Nitrate harmonization: when one sample has several nitrogen results, nitrate+nitrite as N is used first, then nitrate as N, then nitrate as NO3 converted. Nitrite is normally negligible in well water, so the two are treated as one measure.
- Fraction: if a sample has both a total (unfiltered) and a dissolved (filtered) result, the total is used. Most USGS groundwater metals are dissolved only, so most values are dissolved.
- One sample = one well on one date. Duplicate results for that well and date collapse to one; a detection beats a non-detect and the highest detected value is kept.
- Non-detects: a result flagged "Not Detected" (or reported with "<") is stored as "below its reporting limit", never as a measurement at the limit and never as zero. Each quantile is computed twice, with non-detects at 0 and with non-detects at their limit. When both agree the quantile is exact. When they differ, the quantile falls among non-detects; the file holds the upper bound and
median_is_upper_bound/p90_is_upper_boundis True, so the site should show it as "< value".maxis the highest detected value (blank if nothing was detected). A non-detect whose reporting limit is above the benchmark says nothing about whether the water was over it, so it is left out of every statistic and counted inn_nd_limit_above_benchmark_excluded(nationally about 4,000 arsenic and 4,000 lead samples, and about 650 each for PFOA and PFOS, where older methods had limits above 4 ng/L). Non-detects without any stated limit get the median reporting limit for that contaminant. "Detected not quantified" / "Present below quantification limit" results are treated as "< quantitation limit". - How a non-detect is recognized: ResultDetectionConditionText (Not Detected, Below Reporting Limit, *Non-detect and similar), a "<" in the value, text values such as ND, BDL or Absent, MeasureQualifierCode U or <, and Florida DEP qualifier codes U or K written at the start of ResultCommentText ("U"). Florida reports non-detects as the limit with only that comment code; without parsing it, about 30,000 Florida non-detects would have counted as detections.
- Coliform and E. coli: presence/absence. A sample is positive if the count is above zero or the result says present/detected.
n_over_benchmarkis the number of positive samples andpct_over_benchmarkthe percent positive; median, p90 and max are blank. - Benchmarks: nitrate 10 mg/L N (MCL), arsenic 10 ug/L (MCL), uranium 30 ug/L (MCL), fluoride 4 mg/L (MCL), PFOA and PFOS 4 ng/L each (MCLs finalized April 2024; in May 2025 EPA said it would keep these two and move the compliance date from 2029 to 2031, while rescinding the other PFAS limits), lead 15 ug/L (action level; the 2024 Lead and Copper Rule Improvements lower it to 10 ug/L from November 2027), manganese 300 ug/L (lifetime health advisory, no MCL), iron 300 ug/L (secondary, cosmetic), radon 4,000 pCi/L (the proposed alternative MCL from 1999, never finalized; the proposed MCL was 300 pCi/L), coliform and E. coli any positive. "Over" means strictly greater than the benchmark.
- Extra columns beyond the core spec:
n_detected,median_is_upper_bound,p90_is_upper_bound,n_wells_over_benchmark,n_nd_limit_above_benchmark_excluded. State rows usestate_fips(2-digit) in place offips. - Coverage: 2,286 counties have at least one contaminant. Counties per contaminant: nitrate 2,127; manganese 2,105; iron 2,098; fluoride 2,063; arsenic 1,999; lead 1,978; uranium 1,740; total coliform 1,424; E. coli 1,426; radon 1,381; PFOA 256; PFOS 240. Counties with 5 or more samples are far fewer (for example nitrate 1,364, radon 364, PFOA 99).
- Spot checks run on the output: arsenic medians of 99 ug/L in Churchill County NV (Fallon), 45 ug/L in Kennebec County ME and 14 ug/L with 53% of samples over 10 in Rockingham County NH; nitrate 35% of samples over 10 mg/L in Fresno County CA, 33% in Tulare, 33% in Merced, 79% in Whatcom County WA (Sumas-Blaine aquifer), and 55% in Sioux County IA, though Iowa and Nebraska have few samples in WQP.
- County comes from the Station service StateCode + CountyCode. State rows use the station's state code.
- Caveats:
- Sampling is not random. Wells are sampled for studies, contamination investigations and monitoring networks, so a county's numbers describe the wells someone chose to test, not a representative set of household wells. Counties near a known problem (a nitrate plume, a PFAS site) can look worse than the typical well; most counties have only a few samples or none.
- Many sites are monitoring wells, observation wells or public-supply wells, not domestic wells. Monitoring wells are often shallow and sit next to the source being watched; public-supply wells are often deep. Neither matches a typical private well.
- Statistics are per sample, so a well sampled many times weighs more than a well sampled once.
n_wellsandn_wells_over_benchmarkhelp show how widespread a result is. - Use
n_samplesbefore showing a number. A county with one or two samples should be shown as "few samples", not as a county average. - Coverage is uneven between states and contaminants. WQP holds what agencies submit; many state private-well testing programs and most public-water-system compliance data (SDWIS) are not in it. PFAS and radon have few well samples nationally.
- USGS froze NWIS data in the legacy WQX 2.2 services in March 2024. The newer WQX 3.0 endpoint (
/wqx3/Result/search) timed out or returned truncated files during this build, so USGS samples collected after early 2024 are probably missing. State and tribal (WQX) data run through September 2026. - Iowa and Nebraska look thin. Their state well-testing data (for example Iowa's private-well program and Nebraska's Quality-Assessed Agrichemical Database) are mostly not in WQP, so the counties best known for nitrate show only a handful of samples.
- Maximums include contaminated-site monitoring wells, and a few look like unit errors (lead up to 270,000 ug/L in Florida, iron up to 10 g/L). Medians and percent-over are more reliable than max; show max with care.
- Florida's coliform data (about 50% of samples positive for total coliform) comes mostly from shallow monitoring-network wells and is not a guide to household wells.
- Mixed reporting limits: old samples often have higher limits (for example arsenic at 1 to 5 ug/L), which is why some medians are upper bounds.
- Dissolved metals understate total metals where particles are present, most noticeably for iron, manganese and lead.