How to Analyse Washington's Electric Vehicle Registrations in Python

On this page

Problem statement

Washington publishes every battery-electric and plug-in hybrid vehicle registered with its Department of Licensing: 300,142 vehicles in the October 2026 file, with make, model, model year, electric range, county, ZIP code, census tract and electric utility. It is one of the few vehicle-level EV datasets in the US, and it comes with a monthly history by county that includes every non-electric vehicle too. This page loads both, explains what one row is, and shows the columns that need care: out-of-state addresses, a location point, pipe-joined utilities and, on later pages, the range and VIN columns.

Quick answer

Download the Electric Vehicle Population Data CSV from data.wa.gov (dataset f6w7-q2d2), read it with ZIP code and tract as strings, and count rows by County, Make or Electric Vehicle Type. Each row is one registered vehicle, keyed by DOL Vehicle ID. For shares of all vehicles, use the Population Size History By County dataset (3d5d-sdqb).

print(ev.kind.value_counts().to_dict(), f"| registered to a Washington address: {(ev.state == 'WA').mean():.2%}")
print(ev.groupby("county").size().sort_values(ascending=False).head(5).to_dict())
print("top makes:", ev.make.value_counts().head(5).to_dict())
{'BEV': 241840, 'PHEV': 58302} | registered to a Washington address: 99.74%
{'King': 143976, 'Snohomish': 37803, 'Pierce': 25169, 'Clark': 18915, 'Thurston': 11043}
top makes: {'TESLA': 122291, 'CHEVROLET': 20218, 'FORD': 15997, 'NISSAN': 15994, 'KIA': 14897}

241,840 of the vehicles are battery-electric and 58,302 plug-in hybrids. 99.74% are registered to a Washington address. King County has 143,976, almost half the state, and Tesla makes 122,291 of them, six times the next make, Chevrolet.

Map of Washington's 39 counties shaded on a log scale by registered electric vehicles, darkest in King County and around Puget Sound, lighter east of the Cascades, palest in the south-east corner. Map of Washington's 39 counties shaded on a log scale by registered electric vehicles, darkest in King County and around Puget Sound, lighter east of the Cascades, palest in the south-east corner.
Registered EVs by county: King County alone has 143,976 of them.

Rows, addresses, points and utilities

1. One row per registered vehicle

print(ev[["vin10", "county", "city", "zip", "model_year", "make", "model", "kind", "range_mi", "tract"]].head(3).to_string(index=False))
print(f"DOL vehicle IDs unique: {ev.dol_id.is_unique}; model years {ev.model_year.min()}-{ev.model_year.max()}")
     vin10   county      city   zip  model_year  make          model kind  range_mi       tract
3FMTK3SU8P     King   Seattle 98177        2023  FORD MUSTANG MACH-E  BEV       0.0 53033000402
JM3KKEHA8S Thurston      Yelm 98597        2025 MAZDA          CX-90 PHEV      26.0 53067012412
5YJ3E1EB8J     King Sammamish 98075        2018 TESLA        MODEL 3  BEV     215.0 53033032224
DOL vehicle IDs unique: True; model years 1999-2027

Each row is a vehicle with a currently valid registration: a Ford Mustang Mach-E in Seattle, a Mazda CX-90 plug-in hybrid in Yelm, a 2018 Tesla Model 3 in Sammamish. DOL Vehicle ID is unique on every row. Model years run from 1999 to 2027, since 2027 models are already on sale. Note the Mach-E's range of 0, which is explained on the range page.

2. Out-of-state registrations

out = ev[ev.state != "WA"]
print(f"vehicles with an address outside Washington: {len(out)} in {out.state.nunique()} states; top {out.state.value_counts().head(4).to_dict()}")
wa_ev = ev[ev.state == "WA"].copy()
vehicles with an address outside Washington: 789 in 50 states; top {'CA': 174, 'VA': 101, 'FL': 47, 'TX': 44}

789 vehicles have an address in another state, spread over 50 states, led by California (174) and Virginia (101): military personnel, students and others who keep a Washington registration. They have no Washington county, so drop them before county or tract maps.

3. Points from the location column

xy = wa_ev.location.str.extract(r"POINT \((?P<lon>-?[\d.]+) (?P<lat>-?[\d.]+)\)").astype(float)
pts = gpd.GeoDataFrame(wa_ev, geometry=gpd.points_from_xy(xy.lon, xy.lat), crs=4326)
print(f"with a location: {xy.lon.notna().mean():.2%}; distinct locations: {pts.geometry[xy.lon.notna()].drop_duplicates().size:,} "
      f"for {wa_ev.zip.nunique():,} ZIP codes")
with a location: 100.00%; distinct locations: 589 for 590 ZIP codes

Vehicle Location is WKT text, POINT (lon lat), and parses for 100.00% of Washington rows. But there are only 589 distinct points for 590 ZIP codes. The point is the centre of the owner's ZIP code, not the vehicle's address. The fix page shows what that does to a map.

Map of Washington with blue circles at ZIP code centres sized by the number of EVs, a dense cluster of large circles around Seattle and smaller ones around Spokane, Vancouver and the Tri-Cities. Map of Washington with blue circles at ZIP code centres sized by the number of EVs, a dense cluster of large circles around Seattle and smaller ones around Spokane, Vancouver and the Tri-Cities.
The location column: 589 points, one per ZIP code, each carrying all of that ZIP code's vehicles.

4. Utilities are joined with a pipe

u = wa_ev.utility.str.split("|")
parts = u.explode()
print(f"vehicles listing more than one utility: {(u.str.len() > 1).mean():.1%}; empty pieces between pipes: {(parts == '').sum():,}")
print("most listed:", parts[parts != ""].value_counts().head(3).to_dict())
vehicles listing more than one utility: 75.0%; empty pieces between pipes: 202,290
most listed: {'PUGET SOUND ENERGY INC': 176428, 'CITY OF TACOMA - (WA)': 172191, 'BONNEVILLE POWER ADMINISTRATION': 63911}

75.0% of vehicles list more than one electric utility, joined with |: the field can name several utilities whose territories cover the area, often with an empty slot between them (PUGET SOUND ENERGY INC||CITY OF TACOMA - (WA)). Splitting leaves 202,290 empty pieces from those doubled pipes, which must be dropped before counting. Puget Sound Energy, Tacoma's city utility and the Bonneville Power Administration appear most often. A vehicle can only be assigned to one utility with the owner's address, which the file does not have.

Counties against all vehicles, and a layer to keep

The data used on this page

The Washington State Department of Licensing's Electric Vehicle Population Data and its monthly history by county, saved on this site on 15 October 2026, and Census Bureau 2023 county boundaries.

from pathlib import Path

import geopandas as gpd
import numpy as np
import pandas as pd
import requests

Path("data").mkdir(exist_ok=True)
# Washington State Department of Licensing, via data.wa.gov: Electric Vehicle Population Data (f6w7-q2d2), one row per
# registered battery-electric or plug-in hybrid vehicle, and Electric Vehicle Population Size History By County (3d5d-sdqb),
# monthly counts since 2017. Both are replaced monthly, so they are read from copies saved on this site on 15 October 2026.
FILES = ["wa-ev-population-2026-10-15.zip", "wa-ev-population-history-2026-10-15.zip"]
for name in FILES:
    if not Path(f"data/{name}").exists():
        Path(f"data/{name}").write_bytes(requests.get(f"https://data.spatialworkflow.io/{name}", timeout=600).content)
NAMES = {"VIN (1-10)": "vin10", "County": "county", "City": "city", "State": "state", "Postal Code": "zip", "Model Year": "model_year",
         "Make": "make", "Model": "model", "Electric Vehicle Type": "ev_type", "Clean Alternative Fuel Vehicle (CAFV) Eligibility": "cafv",
         "Electric Range": "range_mi", "Legislative District": "district", "DOL Vehicle ID": "dol_id", "Vehicle Location": "location",
         "Electric Utility": "utility", "2020 GEOID": "tract"}
ev = pd.read_csv("data/wa-ev-population-2026-10-15.zip", dtype={"Postal Code": str, "2020 GEOID": str}).rename(columns=NAMES)
ev["kind"] = ev.ev_type.str.extract(r"\((BEV|PHEV)\)")[0]
hist = pd.read_csv("data/wa-ev-population-history-2026-10-15.zip")
hist["date"] = pd.to_datetime(hist.Date, format="%B %d %Y")
if not Path("data/cb_2023_us_county_20m.zip").exists():
    Path("data/cb_2023_us_county_20m.zip").write_bytes(requests.get("https://www2.census.gov/geo/tiger/GENZ2023/shp/cb_2023_us_county_20m.zip", timeout=300).content)
wa = gpd.read_file("data/cb_2023_us_county_20m.zip").query("STATEFP == '53'").to_crs(5070)
print(f"{len(ev):,} electric vehicles registered with Washington DOL; history: {hist.date.min():%b %Y} to {hist.date.max():%b %Y}")
300,142 electric vehicles registered with Washington DOL; history: Jan 2017 to Sep 2026

Example 1: per county, against all registered vehicles

latest = hist[(hist.date == hist.date.max()) & (hist.State == "WA") & (hist["Vehicle Primary Use"] == "Passenger")]
c = latest.set_index("County")[["Electric Vehicle (EV) Total", "Total Vehicles", "Percent Electric Vehicles"]]
print(c.sort_values("Electric Vehicle (EV) Total", ascending=False).head(5).to_string())
           Electric Vehicle (EV) Total  Total Vehicles  Percent Electric Vehicles
County                                                                           
King                            137189         1372622                       9.99
Snohomish                        36281          537935                       6.74
Pierce                           23704          522039                       4.54
Clark                            18186          322561                       5.64
Kitsap                            9709          178064                       5.45

The history file adds what the vehicle file cannot: the number of all registered vehicles. King County's 137,189 electric passenger vehicles are 9.99% of its 1,372,622, against 4.54% in Pierce County. The two files differ slightly (King has 143,976 vehicles in the population file) because the history counts passenger vehicles only and is dated the end of September.

Horizontal bar chart of the twelve counties with the most electric passenger vehicles, King far ahead at 137,189, with each county's EV share printed beside it, from 9.99% in King down to Yakima, the lowest of the twelve. Horizontal bar chart of the twelve counties with the most electric passenger vehicles, King far ahead at 137,189, with each county's EV share printed beside it, from 9.99% in King down to Yakima, the lowest of the twelve.
Counties with the most EVs, and EVs as a share of their passenger vehicles in September 2026.

Example 2: a GeoPackage of counts by county

cnt = wa_ev.groupby("county").agg(evs=("dol_id", "size"), bev_share=("kind", lambda k: (k == "BEV").mean())).reset_index()
out_gdf = wa.merge(cnt, left_on="NAME", right_on="county", how="left")
out_gdf.to_file("wa_ev_by_county.gpkg", layer="counties", driver="GPKG")
print(f"{len(out_gdf)} counties written, {out_gdf.evs.isna().sum()} without a match")
39 counties written, 0 without a match

All 39 Washington counties match the Census county names, so a county layer with EV counts and battery-electric share is one merge away.

Where the file comes from

The Department of Licensing extracts every vehicle with a current registration whose fuel type is electric or plug-in hybrid each month, adds the geography (county, legislative district, census tract, utility) from the owner's address, and removes the address and the last seven characters of the VIN before publishing. The file is a snapshot of the registered stock, not of sales. A car sold out of state or scrapped disappears from the next month's file, and a used EV imported from Oregon appears.

That makes it the right source for "how many EVs are on Washington's roads, and where", and the wrong one for "how many EVs were sold this year". For sales, use new-registration data or the state's title transactions.

Columns to handle first

  • Read Postal Code and 2020 GEOID as strings. As numbers, ZIP codes lose leading zeros in other states and tract IDs can turn into floats.
  • Electric Range 0 means not researched, not zero range.
  • VIN (1-10) is a partial VIN shared by many vehicles; count DOL Vehicle ID.
  • The file is replaced monthly. Cite the month you used; this page uses the copy of 15 October 2026.

FAQ

How many electric vehicles are registered in Washington State?

300,142 battery-electric and plug-in hybrid vehicles in the Department of Licensing file of October 2026, 241,840 of them battery-electric.

What does one row of the Electric Vehicle Population Data mean?

One currently registered vehicle, identified by DOL Vehicle ID, with its make, model, model year and the owner's county, ZIP code and census tract.