Why It Matters
If you've ever joined Census demographic data to BLS employment data to HUD Fair Market Rent, you've used a FIPS code. It's the federal standard identifier for states (2-digit) and counties (3-digit, combined into a 5-digit state+county code). Every federal dataset keys its county-level rows by FIPS. Why investors care: CBSA boundaries change across OMB vintages, but county FIPS codes are stable. When you aggregate federal data to the CBSA level, you join through county FIPS — not through publisher-provided MSA strings that may or may not match.
At a Glance
- What it is: The federal 5-digit numeric identifier for every U.S. county — 2-digit state + 3-digit county code.
- Why it matters: Every federal dataset uses FIPS as the canonical county key. It's the join column that makes Census + BLS + BEA + HUD + FHFA data combinable.
- How to use it: When aggregating to CBSA level, join through `geo.county.fips` to the CBSA code. When querying a single county, use the FIPS code, not the county name (county names collide — there are 30+ "Washington Counties").
- Format: `SSCCC` where SS = state FIPS (01-78) and CCC = county FIPS (001-840).
- Governance: Originally a NIST standard (FIPS 6-4 for counties). Formally superseded by ANSI/Census "GNIS" codes in 2008, but the 5-digit format is identical and the term "FIPS code" remains the industry-standard usage.
How It Works
What FIPS actually is. FIPS stands for Federal Information Processing Standards — a family of codes the U.S. government developed starting in the 1960s to standardize how federal agencies exchange data. For real estate investors, the one that matters is FIPS 6-4, the county code standard. It assigns a 2-digit number to each state (Alabama = 01, California = 06, Ohio = 39, Texas = 48) and a 3-digit number to each county within the state (Franklin County OH = 049, Harris County TX = 201). The combined 5-digit "state+county FIPS" code uniquely identifies every county in the country: Franklin County Ohio is 39049, Harris County Texas is 48201. Every federal agency uses these codes. The standard was originally published by the National Bureau of Standards (now NIST); the formal FIPS 6-4 publication is still referenced even though FIPS was formally superseded by ANSI/Census codes in 2008. The 5-digit format and most code values are identical, so "FIPS code" remains common industry usage.
Why FIPS matters more than county name. County names collide. There are 30+ "Washington Counties" in the U.S. There are 15+ "Jefferson Counties." There are 9 "Franklin Counties." If you pull a dataset with rows labeled only by county name, joining it to another dataset requires reconciling which "Washington County" you mean. FIPS codes eliminate the ambiguity: Washington County PA is 42125, Washington County OR is 41067, Washington County MD is 24043. The Census Bureau's ANSI code list is the canonical reference for the full set of codes. For investors using multiple federal data sources — FHFA HPI joined to HUD Fair Market Rent joined to Census building permits joined to BEA personal income — FIPS is how any of that analysis works.
FIPS vs CBSA — political vs economic. FIPS codes identify political units: states, counties. CBSAs identify economic units: groups of counties that share a labor market. For a given real-estate question, you often need both. "What's happening in the Columbus metro economy?" is a CBSA question (CBSA 18140). "What counties are in Columbus metro?" is answered by the CBSA definition — Columbus MSA 18140 includes 8 counties, each with its own FIPS code. To join federal county-level data (say, BLS monthly employment) up to the metro level, you: (1) pull the data at county FIPS grain, (2) look up which CBSA each FIPS maps to, (3) aggregate. The mapping from FIPS → CBSA is published by OMB as part of each CBSA delineation. It changes when OMB updates the CBSA definitions, but the FIPS codes themselves don't change — the mapping does. That's why using FIPS as the stable join key is essential for multi-year analysis.
Where FIPS appears in investor workflows. Every serious federal-data pipeline keys county-level tables by FIPS. FRED includes FIPS as a series identifier for county-level BLS employment and BEA personal income series. Our own pipeline keys county tables by a `fips` column, and joins them up to CBSA through a mapping table. HUD's Section 8 income limits are published by FIPS. The IRS migration data that feeds home price analysis uses FIPS as the origin/destination key. If you're building any kind of multi-source analysis, FIPS is the identifier you standardize to. If the source you're buying from doesn't include FIPS codes, ask them for it — or be prepared to do a name-based fuzzy join, which is how data mistakes happen.
Real-World Example
Carmen Vargas tries to combine three federal datasets and discovers why FIPS exists.
Carmen is building an underwriting spreadsheet for 3 counties in Ohio. She downloads:
- BLS LAUS: monthly unemployment by county name, state abbreviation
- Census ACS: median household income by county name, state name
- BEA Regional: per-capita personal income by county FIPS
The first two datasets have "Franklin County" rows. She needs to figure out which Franklin County each refers to — Ohio has one, but so do 8 other states. Kentucky's Franklin County, Indiana's Franklin County, Virginia's Franklin County... all would also show up in a dataset labeled just "Franklin County."
She could filter by state column, but then she notices BLS uses "OH" while Census uses "Ohio" — a string-matching join would fail unless she normalized.
Then she pulls the BEA dataset, which has a FIPS column. 39049. She adds a FIPS column to the BLS and Census rows using a lookup table keyed to (state + county name). Now all three datasets share the same key. The join works.
The underwriting spreadsheet she builds scales: she can add a fourth dataset (HUD FMR), a fifth (FHFA HPI), a sixth (IRS migration) — all of them key by FIPS. If she'd started with string-based county names, every new dataset would have required a custom reconciliation pass.
Pros & Cons
- Every federal dataset uses FIPS as the canonical county identifier — one key makes everything combinable
- 5-digit codes eliminate the ambiguity that county names introduce (30+ "Washington Counties" nationwide)
- FIPS codes are stable across time — counties don't get renumbered when CBSAs do
- The Census Bureau publishes a free, canonical ANSI code list that's the single source of truth
- FIPS is the lingua franca of federal statistical systems — everyone from Census to BLS to FRED speaks it
- Commercial data providers don't always include FIPS codes, so you sometimes have to add them yourself via a lookup table
- The 2-digit state FIPS runs 01-78 but not contiguously (skips some numbers for historical reasons); you can't just infer "state 39 = 39th state alphabetically"
- FIPS codes have been formally superseded by ANSI/Census codes since 2008, which creates occasional confusion in documentation — but the format and values are identical
- Some datasets use 5-digit FIPS as a string and strip leading zeros ("39049" vs "39049" vs "1011"), which breaks string joins when files are saved as numeric
- Puerto Rico, Guam, and the territorial counties have their own FIPS codes that some tools don't handle correctly
Watch Out
- Leading-zero loss: When you save a FIPS code to CSV and reopen in Excel, "01011" (Autauga County AL) becomes "1011" because Excel strips leading zeros on numeric columns. Always save FIPS as text or pad back to 5 digits on load.
- FIPS vs ANSI: NIST formally retired FIPS 6-4 in 2008 in favor of ANSI codes maintained by Census. The values and format are identical; only the governance changed. "FIPS" remains the industry term.
- State code isn't sequential: State FIPS codes are historically assigned (Alaska = 02 because it was the 49th state admitted, California = 06 because it was the 31st — the numbering reflects pre-statehood territory assignments, not alphabetical order). You can't infer anything from the number.
- Historical county changes matter: Some counties have been renamed or merged (e.g., Shannon County SD became Oglala Lakota County SD in 2015 with a new FIPS code 46102 replacing 46113). Historical data joined by FIPS needs vintage-aware handling.
- Territorial FIPS: Puerto Rico counties use state code 72, Guam uses 66, Virgin Islands 78. Some tools silently filter these out thinking they're invalid. If your analysis covers PR, confirm your toolchain handles it.
Ask an Investor
The Takeaway
FIPS codes are the federal join key for anything county-level. If you're building multi-source real estate analysis, standardize on FIPS early and join everything through it. The code survives OMB vintage changes, eliminates county-name ambiguity, and is published free by Census. Every other join approach — by county name, by state abbreviation, by publisher-specific ID — will eventually bite you.
