2024 map
AB 604 map (2024 votes)
2024 map vs AB 604
Map Dem seats Mean-median Efficiency gap
2024 map 43 0.015 9.2%
AB 604 map (re-run) 46 -0.028 17.9%

If you run the 2024 election again on the AB 604 map with the same votes, Democrats go from 43 seats to 46 out of 52, so they gain 3. The efficiency gap goes from 9.2% to 17.9%, so even more Republican votes get wasted on the new map.

The mean-median score actually goes the other way (+0.015 to -0.028). I think this is because the new map spreads Democratic voters more evenly across districts, which moves the median but doesn’t really show up as an advantage. Since Democrats win about 61% of the vote statewide, mean-median isn’t a great measure here, and the seat count and efficiency gap show the change more clearly.

Caveats:
  • These are 2024 votes and 2024 candidates. Actual elections on the new map will have different candidates, incumbents, and turnout.
  • Approach B assumes every block in a precinct voted the same way as the whole precinct.
  • Votes hidden as “***” are missing from both maps.
  • In the same-party races from 2024, all the votes count for one party, which could make that party look stronger in those areas.
    • The allocation couldn’t place 751 votes (about 0.005%) because their precincts have no census blocks.

The election and Prop 50

California voters passed Prop 50 on November 4, 2025, about 64% to 36%. It swapped out the congressional map drawn by the independent Citizens Redistricting Commission for a new map drawn by the state legislature (AB 604). The new map is used for the 2026, 2028, and 2030 elections, and then the Commission goes back to drawing maps after the 2030 Census.

Before this, the maps were drawn by the Commission, which is a nonpartisan group of citizens. AB 604 was drawn by the legislature to add Democratic seats, as a response to Texas passing a new map that helps Republicans.

The CA Secretary of State posts the official results, like the certified Statement of Vote, results by county, and the voter guide description of Prop 50.

The Statewide Database

The Statewide Database is California’s redistricting database, run out of UC Berkeley’s law school. It takes election and voter registration data from every county and matches it to census geography, so it can be mapped and compared across the state. The data is free, and it had nothing to do with drawing the Prop 50 map.

For the 2024 general election it has vote counts and registration by precinct, plus files that connect precincts to census blocks. Since it converts county data into its own precincts, its totals can be a little off from the official results.

Units of geography

  • Census blocks are the smallest unit. Everything else is made of blocks, and blocks are inside counties.
  • SV precincts are what counties use to count votes. Some aren’t actual places, like mail ballot precincts or Orange County’s 99999.
  • SR precincts are made by the Statewide Database by combining voting and registration precincts. They’re built from blocks, so they’re always a real area. Some blocks get split between SR precincts.
  • Counties contain whole precincts and blocks.
  • Congressional districts are made of blocks and can cross county lines.

Votes are counted by SV precinct and then converted to SR precincts, so SR counts are close estimates, not exact. A few votes can’t be placed, and very small precincts show up as “***“.

Data files

File Source One row is
state_g24_sov_data_by_g24_srprec.csv Statewide Database one SR precinct’s 2024 votes
g24-results-by-district.xlsx CA Secretary of State one county in a district (plus title and total rows)
g24-candidates-by-district.csv CA Secretary of State one district’s candidates
data/clean/sov_srprec_clean.csv made in Part 2 one SR precinct’s 2024 votes, cleaned
state_g24_sr_blk_map.csv Statewide Database one (partial) census block in an SR precinct
ab604.csv CA Assembly one census block and its new district
tl_2024_06_cd119 shapefile US Census Bureau one 2024 district’s shape
AB604 shapefile CA Assembly one AB 604 district’s shape

Problem 1: Vote counts read in as text

44 vote columns came in as text instead of numbers. The only value that wouldn’t convert was “***“, which shows up where a precinct’s result isn’t reported, so it’s really a missing value.

Fix: read “***” as NA so the columns are numbers, and use na.rm = TRUE when adding things up.

Rows affected: 1,974 precincts (in CNGDEM01).

Values in CNGDEM01 that aren’t numbers
CNGDEM01 n
*** 1974

Problem 2: A precinct with no district

One row has CDDIST = 0, which can’t be right since districts go from 1 to 52. It’s precinct 99999 in Orange County, which holds 441 votes that couldn’t be assigned to a real precinct.

Fix: kept it since it still counts statewide, but flagged it with has_district so it’s left out of district totals and maps.

Rows affected: 1.

The district 0 row
SRPREC_KEY COUNTY CDDIST TOTVOTE CNGDEM01 CNGREP01
0605999999 30 0 441 160 263

Other checks (nothing to fix)

  • No NAs in any column before the fix.
  • 58 counties, which matches California.
  • No duplicate SRPREC_KEYs or duplicate rows.
  • 5,218 precincts have zero votes. I kept them since they don’t change any totals and they’re real places on the map.
  • COUNTY and the district columns are IDs stored as numbers. I left them that way so districts sort 1-52 and match the official results.

Precincts in clean data

25245

Columns in clean data

77

Check: Do my totals match the official ones?

My totals are a little lower than the official ones in almost every district. Most are off by less than 200 votes and the biggest gap is about 800. This is from the “***” precincts, since their votes are hidden in the precinct data but still counted in the official totals.

My totals minus official totals

Q1: What share of the vote did Democrats get in each district?

Democrats got more than half the two-party vote in most districts. The bars at 100% are races with two Democrats, and the empty bar at district 20 is a race with two Republicans. A few districts are close to the 50% line, so those were competitive.

Dem share by district (line at 50%)

Q2: Which races had two candidates from the same party?

Four races. Three had two Democrats (districts 12, 16, and 34) and one had two Republicans (district 20). This happens because of California’s top-two primary.

Same-party races
CDDIST dem rep ind official_votes difference
12 283008 0 0 283025 -17
16 308400 0 0 308476 -76
20 0 288627 0 288788 -161
34 189410 0 0 189414 -4

Q3: How big are precincts?

Really right-skewed. Lots of precincts have zero or almost zero votes, most have under 2,000, and a few have over 4,000.

Precinct sizes

Seats (Dem - Rep)

43 - 9

Dem share of two-party vote

60.7%

Mean-median

0.015

Efficiency gap

9.2%

Mean-median

This is the median minus the mean of the Dem vote share across districts. For the 2024 map it’s +0.015, so the median district is about 1.5 points more Democratic than the average. That’s a small Democratic advantage, so the map is pretty close to balanced by this measure.

District vote shares (solid = mean, dashed = median)

Efficiency gap

A vote is wasted if it goes to the loser, or to the winner past the 50% they needed. The efficiency gap is Republican wasted votes minus Democratic wasted votes, divided by all votes. For the 2024 map it’s +9.2%, so Republicans wasted more votes. Democrats got about 61% of the vote but 83% of the seats. Some of this is just because Democrats have such a big majority statewide, not only because of the map. Also, the same-party races (12, 16, 20, 34) and district 37 count as 100% for one party.

Wasted votes by district (above 0 = more Dem votes wasted)

Approach B: Proportional allocation

I split each SR precinct’s votes across its census blocks based on how many of the precinct’s registered voters live on each block (PCTSRPREC). Then I matched each block to its AB 604 district and added up the votes.

This assumes that every block in a precinct voted the same way as the precinct overall, with the same turnout.

Votes kept

99.995%

Did it keep every vote?

751 out of about 15 million votes didn’t end up in a new district. They’re from 17 precincts that don’t have any census blocks in the file. Most are from Orange County’s catch-all precinct 99999 (423 votes), and the rest are small precincts, mostly in San Bernardino County. That’s way too small to change any results.

Precincts that couldn’t be placed
SRPREC_KEY dem rep
0605999999 160 263
06071AP10001 62 65
06071AP30002 8 9
06071CO42765 5 6
06071RC11862 2 6
06071RC21185 9 7
06071RIA1100 17 17
06071SB62614 9 3
06071UNI0024 9 10
06071UNI0548 6 5
06071UNI2567 5 7
06071UNI2576 10 18
06073999001 5 8
06073999392 5 5
061071088001 0 5
061075998049 0 1
0611312041 4 0
Estimated 2024 votes in each AB 604 district
new_cd dem rep
1 182536 150547
2 231970 148401
3 189935 164638
4 189348 143688
5 118108 229041
6 171008 151904
7 189330 144663
8 206138 95613
9 150450 107208
10 241492 122289
11 274823 64326
12 282994 7
13 106097 93398
14 182755 88548
15 211545 77838
16 303563 1222
17 173840 81195
18 148689 80974
19 252380 111787
20 18143 266917
21 95927 98000
22 79246 85059
23 104128 162504
24 214218 127631
25 151325 113437
26 189811 141056
27 155380 128506
28 200210 110832
29 147599 66379
30 213422 101066
31 156576 118185
32 207700 126246
33 139520 98230
34 189289 25
35 140040 110457
36 245999 111947
37 160391 15
38 137694 108221
39 129199 98936
40 160148 211998
41 172525 120963
42 189315 149080
43 160076 53152
44 147262 53784
45 152843 138564
46 135824 84761
47 184945 164007
48 163694 155138
49 206515 173227
50 209472 151469
51 201458 141837
52 168463 94895