The plant and generator inventories tell you what a power plant is—how many megawatts, what fuel, where it stands, whether it still runs. They do not tell you whose it is. That answer lives in a separate, smaller schedule of EIA Form 860: the ownership file, roughly 5,400 generator-ownership records that name the company behind each generating unit and, crucially, the percentage each company holds when a plant is owned by more than one. It is the layer where capacity stops being a physical fact and becomes an equity position—the record that lets you trace which regulated utility, which merchant producer, which public authority, and which financial investor actually controls how many megawatts of the American grid.
This article covers what the ownership schedule is and how it sits inside EIA Form 860; why joint ownership exists and why it is the reason the schedule has to be a separate file; the field structure and the percent-owned column that does the real work; the taxonomy of owner types—regulated utilities, independent power producers, public power and cooperatives, and the financial and infrastructure investors now moving into generation—and how to roll capacity up to the parent company; the market-concentration and energy-transition analyses the data supports, from coal retirements to the build-out of gas, wind, solar, and batteries; how the schedule joins to the plant and generator inventories and the wider electricity data by plant code; a Python workflow that pulls the ownership rows, aggregates owned capacity by owner, and flags the jointly owned plants; and the caveats—equity versus operational control, the parent-company resolution problem, and annual-snapshot lag—that every analyst must internalize before drawing conclusions.
What the dataset is
EIA Form 860 is the annual census of electric generators in the United States, collected by the Energy Information Administration—the statistical agency within the Department of Energy. Every year, the operators of utility-scale generating units report the existence and characteristics of those units to EIA, and the agency publishes the result as a set of related schedules. Two of those schedules describe the physical assets: a plant file (one row per plant, with location, balancing authority, and plant-level attributes) and a generator file (one row per generating unit, with nameplate capacity, prime mover, energy source, operating status, and in-service dates). The schedule this article is about answers a different question entirely—not what the asset is, but who owns it.
The ownership schedule records the equity ownership of each generating unit. Its grain is one row per plant–generator–owner combination: a generator owned outright by a single company contributes one row, while a generator co-owned by four utilities contributes four rows, each naming one owner and the fraction it holds. In our database this record is stored as the table eia_owners, roughly 5,400 generator-ownership records. The columns identify the unit, name the owner, and record the percentage of the unit that owner holds:
plant_code -- EIA plant code; joins to the plant & generator files
generator_id -- the generating-unit ID within the plant
owner_name -- the company that holds an equity stake in the unit
owner_id -- EIA-assigned owner / entity identifier
owner_street -- owner mailing address: street
owner_city -- owner mailing address: city
owner_state -- owner mailing address: state
owner_zip -- owner mailing address: ZIP
percent_owned -- the share of the generator this owner holds
utility_id -- the responding/operating utility for the unit
utility_name -- name of the responding/operating utilityThe load-bearing columns are plant_code, generator_id, owner_name, and percent_owned. The plant code is EIA's persistent numeric identifier for a generating facility; together with the generator ID it uniquely identifies a single unit and is the key that joins this schedule to the generator file (which supplies the unit's capacity) and to the plant file (which supplies location and balancing authority). The owner name identifies the equity holder, distinct from the utility_name, which is the responding or operating utility—a distinction that matters because the company that runs a plant is frequently not the only company that owns it. And percent owned is the field that gives the schedule its reason for existing: it is the number an analyst multiplies against a generator's nameplate capacity to compute how many megawatts a given owner actually controls, and it is the only way to divide a co-owned plant's capacity among the companies that share it.
Why joint ownership exists
Joint ownership is not an accounting curiosity; it is the structural reality that the ownership schedule was built to capture, and it is the single most important thing to understand about the data. A large fraction of the country's biggest baseload plants—especially nuclear units and the large coal-fired stations built in the mid-twentieth century—are owned not by one company but by a consortium of several, each entitled to a defined share of the plant's output and responsible for a corresponding share of its costs. The ownership schedule exists precisely because, without the percent-owned column, there would be no way to say which company controls how much of such a plant.
The economics that drove this are straightforward. A large baseload generating unit—a gigawatt-scale nuclear reactor, or a multi-unit coal station—is an enormous capital investment, often larger than any single utility in a region could comfortably finance or fully use on its own. The historical solution was the joint plant: several neighboring utilities pool their capital to build one big, efficient unit, and each takes a percentage of the capacity and energy proportionate to its investment. A utility that holds, say, a quarter of a coal station is entitled to roughly a quarter of its megawatts and pays roughly a quarter of its operating and capital costs. This let utilities capture the economies of scale of large thermal units, diversify the risk of a single very large asset across multiple balance sheets, and share reserve capacity—all without any one of them having to own the whole thing. The arrangement is governed by detailed joint-ownership and operating agreements that designate one party as the operator while the others remain non-operating owners with rights to their share.
The analytic consequence is that capacity cannot be attributed to companies by counting plants. If an analyst assigns each plant wholly to the utility that operates it, the megawatts of every jointly owned station are mis-attributed: the operator is credited with capacity that legally belongs to its co-owners, and those co-owners—who may be substantial generation companies in their own right—are credited with nothing for their stake. Only by reading the percent-owned field and multiplying it against each generator's capacity can the fleet be apportioned correctly. This is why the ownership schedule is a distinct file rather than a column on the generator record: a single generator can have several owners with several different percentages, a one-to-many relationship that a flat generator row cannot represent. Untangling that relationship is the entire purpose of the data.
The owner types
The companies that appear in the owner field span the full institutional range of the American electricity industry, and recognizing the categories is what turns a list of names into a map of how the generation fleet is held. The categories are not mutually exclusive labels in the data—EIA records the owner's name, not a tidy taxonomy—but they are the structure an analyst imposes to make sense of who owns what.
Regulated utilities are the historical core. These are the investor-owned utilities whose retail rates are set by state public utility commissions and whose generating assets sit in a regulated rate base—the model under which the utility builds and owns the plant and recovers its costs, plus an allowed return, from captive ratepayers. In the regions that never restructured, and for the regulated portions of partially restructured states, these utilities still own the bulk of the generation, and they are the dominant co-owners of the legacy nuclear and coal joint plants. Independent power producers (IPPs), also called merchant generators, are the product of restructuring: companies that own generation and sell its output into wholesale markets at market prices, bearing the market risk themselves rather than recovering costs through a regulated rate base. The growth of IPP ownership—much of it through utilities divesting plants into unregulated affiliates or selling them outright—is one of the central stories the ownership data tells over time.
Public power authorities and cooperatives form the non-investor-owned segment. Municipal utilities, state and regional power authorities, federal power agencies, and rural electric cooperatives own a meaningful share of the fleet—particularly large public power entities that are major co-owners of baseload plants—and they operate on a not-for-profit, cost-of-service basis rather than for shareholder return. Finally, and increasingly, the owner field names financial and infrastructure investors: private equity firms, infrastructure funds, pension and sovereign-wealth investors, and the holding companies they form to acquire generating assets. As generation became a tradable, cash-flowing infrastructure asset class, private capital moved into ownership—buying merchant fleets, backing new renewable and storage development, and, through holding structures, holding stakes that can be genuinely difficult to attribute to an ultimate parent. Tracking the entry of this capital, and the shift in the balance from regulated utility to merchant to financial ownership, is one of the most consequential uses of the schedule.
Rolling capacity up to the parent company
The owner field names a legal entity, but the question an analyst usually wants answered is about the parent company: how many megawatts does a given corporate group control across all of its subsidiaries and affiliates? Answering it requires two steps—apportioning capacity to each named owner using percent-owned, and then mapping those named owners up to their ultimate parents—and the second step is where most of the difficulty lies.
The first step is mechanical and is exactly what the schedule is designed for. For each ownership row, the owned capacity is the generator's nameplate capacity (from the generator file, joined on plant code and generator ID) multiplied by the percent-owned share. Summing owned capacity across all of an owner's rows yields the total megawatts that owner holds—correctly counting only its fractional stake in every jointly owned plant and its full stake in the plants it owns alone. This is the calculation that converts a messy, one-row-per-stake file into a clean ranking of who controls how much of the fleet.
The second step—rolling named owners up to parents—is the hard part, because a single corporate group routinely owns generation through many differently named subsidiaries. A large holding company may hold assets through a regulated utility subsidiary in one state, a differently named regulated utility in another, and one or more unregulated merchant affiliates, each appearing under its own name in the owner field. Without a mapping from those subsidiary names to their common parent, an analysis will scatter a single corporate group's capacity across a dozen entries and badly understate its true scale. Building and maintaining that ownership-to-parent crosswalk—and keeping it current as mergers, acquisitions, and divestitures reshuffle the corporate map—is the central data-quality task in any serious concentration analysis, and it is the reason that parent-level results should always disclose the crosswalk they depend on. The schedule gives you the equity facts; the parent rollup is the interpretation you layer on top.
Market concentration and the energy transition
With capacity correctly apportioned and rolled up to parents, the ownership schedule becomes the foundation for two of the most important kinds of electricity analysis: who controls the market, and who is building and retiring what as the generation mix changes.
Market concentration is the first. By aggregating owned capacity to the parent level and then to a geographic or market footprint—a state, a balancing authority, or the territory of an independent system operator or regional transmission organization—an analyst can measure how concentrated generation ownership is, computing the share held by the largest owners and standard concentration indices for the relevant market. This is directly relevant to competition policy and market-power analysis: in restructured wholesale markets, the concern is whether a small number of owners control enough capacity in a constrained area to influence prices, and the only way to test it rigorously is to apportion every generator's capacity to its true owners and parents within the market boundary. The ownership schedule, joined to the plant file for the market footprint and the generator file for capacity, is what makes that measurement possible from public data.
The energy transition is the second, and it is where the longitudinal value of the annual census shows most clearly. Because Form 860 is collected every year, the ownership schedule can be tracked over time to see how the ownership of the transition is unfolding alongside the technological shift. On the retirement side, it identifies who owns the coal plants coming offline—which utilities and which co-owner consortia are absorbing the stranded-cost and decommissioning exposure of the fleet that is closing. On the build side, it identifies who is putting up the new gas, wind, solar, and battery-storage capacity—and here the data documents a striking structural change, as a large share of new renewable and storage capacity is owned not by the traditional regulated utilities but by independent power producers and the financial and infrastructure investors backing them. Reading the owner types across the in-service dates in the generator file shows the entry of private capital into generation in real time: the transition is not only from coal to renewables but, in many regions, from utility ownership to merchant and financial ownership, and the ownership schedule is the record that makes that second shift visible.
Joining to the plant and generator inventories
The ownership schedule is nearly useless in isolation—it names owners and percentages but carries no capacity, no location, and no fuel—and it becomes powerful only when joined to the rest of Form 860 and the wider electricity data. The plant_code, alone or paired with generator_id, is the universal join key.
The first and indispensable join is to the generator file, on plant code and generator ID. The generator file supplies the nameplate capacity that the percent-owned share is multiplied against, along with the prime mover, energy source, and operating status—everything needed to know not just how many megawatts an owner controls but what kind of megawatts: coal versus gas versus wind versus solar versus storage, operating versus planned versus retired. Without this join the ownership percentages are abstract fractions; with it they become a megawatt-resolved, fuel-resolved ownership map. The second join is to the plant file, on plant code, which supplies the geography—state, county, latitude and longitude, and the balancing authority— needed to place each owned megawatt in a market footprint and to roll ownership up by ISO/RTO or state for concentration analysis.
Beyond Form 860 itself, the plant code joins outward to the broader EIA electricity data: the generation and fuel-consumption records reported on the related operating forms are keyed to the same plants, so an owner's apportioned capacity can be related to the actual energy its plants generate, and the responding-utility and owner identifiers tie the ownership picture to the financial and operational reporting collected elsewhere in the EIA data system. The result is that the small ownership schedule sits at the center of a much larger graph—equity stakes on one side, physical and operational reality on the other—and the plant code is the edge that connects them.
Analytical uses
A national, generator-resolved record of equity ownership, joinable to capacity and geography, supports a distinctive set of analyses that the physical inventories alone cannot.
Owner and parent capacity rankings are the most direct use: apportion capacity by percent-owned, roll it up to the parent, and rank companies by the megawatts they control—overall, by fuel type, or within a market. This is the calculation that answers “who are the largest generation owners in the country, and in this region?” in a way that respects joint ownership rather than mis-crediting whole plants to their operators. Joint-ownership analysisexploits the one-to-many structure directly: identifying which plants are co-owned, by whom, and in what shares surfaces the consortia behind the big baseload units and the web of cross-ownership among utilities in a region—information that matters for understanding how the costs and risks of a retiring coal plant or an aging nuclear unit are distributed across multiple companies.
Tracking the shift in ownership type uses the annual cadence to follow the migration of capacity from regulated utility to merchant to financial ownership over time, and to document the entry of private capital into generation— especially into new renewables and storage. Finally, energy-transition attribution joins ownership to the generator file's fuel and status fields to answer who owns the capacity being retired and who owns the capacity being built: which companies carry the coal-retirement exposure, and which are accumulating the wind, solar, and battery fleet that is replacing it. Each of these depends on the same two-step discipline—apportion by percent-owned, then resolve names to parents—and each is impossible to do correctly without the ownership schedule.
Python workflow: owned capacity by owner and joint-ownership flags
The script below downloads the full Form 860 bulk archive from eia.gov, reads the ownership and generator schedules out of the ZIP of Excel workbooks, joins them on plant code and generator ID, and computes two of the core metrics: owned nameplate capacity rolled up by owner (multiplying each generator's capacity by the percent-owned share), and the share of plants in the schedule that are jointly owned. No API key is required for the bulk file download. Because Form 860 workbook filenames and header offsets shift from year to year, and because the percent-owned field is reported as a fraction in some releases and as a percent in others, the script discovers the workbooks and columns at runtime and normalizes the share before multiplying; any production use should be validated against the layout file for the specific Form 860 release.
import requests, io, zipfile
import pandas as pd
# EIA Form 860 -- the annual census of US electric generators.
# EIA publishes the full Form 860 as a ZIP of Excel workbooks on
# eia.gov; no API key is required for the bulk file download. The
# archive contains several schedules; the one used here is the
# OWNERSHIP schedule (named like "4___Owner_Y####"), alongside the
# GENERATOR schedule ("3_1_Generator_Y####") that carries each unit’s
# capacity. The exact filenames and the header-row offset shift year
# to year, so the script discovers the workbook and the working
# columns at runtime rather than hard-coding them.
EIA860_ZIP = "https://www.eia.gov/electricity/data/eia860/archive/xls/eia8602023.zip"
def load_zip(url=EIA860_ZIP):
r = requests.get(url, timeout=300)
r.raise_for_status()
return zipfile.ZipFile(io.BytesIO(r.content))
def read_sheet(zf, needle, skip=1):
# Find the workbook whose name contains the needle and read it.
# Form 860 workbooks carry one or two banner rows above the header.
name = next(n for n in zf.namelist() if needle.lower() in n.lower())
return pd.read_excel(io.BytesIO(zf.read(name)), skiprows=skip)
def find(cols, *needles):
# Return the first column whose name contains all of the needles.
for c in cols:
u = str(c).upper()
if all(n.upper() in u for n in needles):
return c
return None
zf = load_zip()
own = read_sheet(zf, "Owner")
gen = read_sheet(zf, "Generator")
# Resolve the join keys and the percent-owned / capacity columns.
o_plant = find(own.columns, "Plant", "Code") or find(own.columns, "Plant", "ID")
o_gen = find(own.columns, "Generator", "ID")
o_owner = find(own.columns, "Owner", "Name")
o_pct = find(own.columns, "Percent", "Owned") or find(own.columns, "Ownership")
g_plant = find(gen.columns, "Plant", "Code") or find(gen.columns, "Plant", "ID")
g_gen = find(gen.columns, "Generator", "ID")
g_cap = find(gen.columns, "Nameplate") or find(gen.columns, "Capacity")
own[o_pct] = pd.to_numeric(own[o_pct], errors="coerce").fillna(0)
gen[g_cap] = pd.to_numeric(gen[g_cap], errors="coerce").fillna(0)
print(f"Ownership rows: {len(own):,} Generator rows: {len(gen):,}")
# --- 1. Attach each generator’s nameplate capacity to its owners ------
merged = own.merge(
gen[[g_plant, g_gen, g_cap]],
left_on=[o_plant, o_gen], right_on=[g_plant, g_gen], how="left",
)
# Percent-owned is reported as a fraction or a percent depending on year;
# normalize to a fraction before multiplying through.
frac = merged[o_pct].where(merged[o_pct] <= 1, merged[o_pct] / 100.0)
merged["owned_mw"] = merged[g_cap] * frac
# --- 2. Roll owned capacity up to the owner ---------------------------
by_owner = (merged.groupby(o_owner)["owned_mw"].sum()
.sort_values(ascending=False))
print("\nTop 15 owners by owned nameplate capacity (MW):")
for owner, mw in by_owner.head(15).items():
print(f" {str(owner)[:44]:<44} {mw:>12,.0f}")
# --- 3. Flag jointly owned plants -------------------------------------
# A plant is jointly owned when more than one distinct owner appears.
owners_per_plant = own.groupby(o_plant)[o_owner].nunique()
joint = owners_per_plant[owners_per_plant > 1]
share = len(joint) / max(owners_per_plant.size, 1)
print(f"\nJointly owned plants: {len(joint):,} "
f"({share:.1%} of plants in the ownership schedule)")
Two practical notes apply. First, the owner rollup in the script aggregates by the named owner exactly as it appears in the file—it deliberately stops short of the parent-company mapping, because that mapping is a curated crosswalk rather than something the raw data supplies, and bolting a half-built crosswalk onto the script would produce confidently wrong rankings. Treat the named-owner ranking as the correct, defensible first result, and the parent rollup as a deliberate second layer that discloses its assumptions. Second, the joint-ownership flag in the script is computed at the plant level for simplicity; a more precise treatment computes it at the generator level, because within a single plant some generators may be wholly owned while others are shared, and the percent-owned shares should be checked to sum to roughly one hundred percent per generator—a useful data-quality test that the raw file does not guarantee.
Limitations and analytical caveats
The ownership schedule is the authoritative public record of who holds equity in US generators, but it carries structural limitations that an analyst must internalize before drawing conclusions.
Equity ownership is not operational control. The percent-owned field records who holds the equity stake, which is not the same as who runs the plant or who dispatches its output. In a joint plant, one co-owner is typically the operator while the others are passive non-operating owners; the schedule records all of their equity shares but does not, in itself, tell you which one makes the operating decisions. For market-power and competition questions, what often matters is control—who can decide whether and when a unit runs, and who markets its energy—and that can diverge from the equity split. The utility_id and utility_name point at the responding/operating utility, which helps, but a rigorous control analysis has to look beyond the equity percentages to the operating agreements and offtake arrangements the schedule does not capture.
Parent-company resolution is the analyst's burden, not the data's. The owner field is a legal-entity name, and a single corporate group owns generation through many differently named subsidiaries and affiliates. The file makes no attempt to roll those names up to ultimate parents, so any parent-level ranking depends entirely on a crosswalk that the analyst builds and maintains. That crosswalk is fragile— names change, entities are created and dissolved, and mergers and divestitures continually reshuffle which subsidiary belongs to which parent—and an out-of-date or incomplete crosswalk will scatter or mis-assign capacity in ways that quietly distort concentration results. Parent-level conclusions are only as good as the mapping behind them, and that mapping should always be disclosed.
It is an annual snapshot, and ownership changes constantly.Form 860 is collected once a year and reflects ownership as of the reporting period; the published file lags the reporting year, and the generation industry transacts continuously. Plants are bought and sold, merchant fleets change hands, and stakes are transferred between the annual snapshots, so the most recent ownership reality is always somewhat ahead of the latest published file. For tracking established structures and multi-year trends the schedule is authoritative; it is not a real-time registry of who owns a given plant today, and any analysis tied to a specific recent transaction should be confirmed against more current sources.
Scope, coverage, and the percent-owned conventions. The schedule covers the utility-scale generators within Form 860's reporting universe and records ownership only for units that actually have a reportable ownership arrangement, so the file is small relative to the full generator inventory—it is the subset of the fleet where ownership is the question, dominated by the jointly owned plants and the units held by entities distinct from the operator. Small behind-the-meter and distributed resources outside Form 860's scope are not here. And the percent-owned field's convention—fraction versus percent, and how it sums across the owners of a generator—has to be checked against the release's layout file rather than assumed, because mis-reading the convention silently scales every apportioned megawatt by a factor of a hundred.
Held with these caveats in mind, the eia_owners table is a uniquely valuable resource: a generator-resolved, percentage-precise record of who holds the equity in the American generation fleet—the layer that turns the physical inventory of plants and generators into an answerable question about ownership, control, concentration, and who is financing the build-out and absorbing the retirement of the grid as it changes.
Related writing
EIA Form 860: The Federal Database Behind Every US Power Plant and Electricity Generator — The physical inventory this schedule attaches to: the plant and generator files supply the capacity, fuel, location, and status that the ownership percentages are multiplied against to compute who controls how many megawatts.
EIA Electricity Data: The Federal Dataset Behind Every Kilowatt-Hour Generated, Sold, and Priced — The operating side that joins to ownership by plant code, relating an owner's apportioned capacity to the energy its plants actually generate, sell, and earn.
FERC Enforcement: The Federal Watchdog Over Energy Market Manipulation — The market-power and manipulation questions that ownership concentration raises are exactly what FERC polices, making the apportioned-ownership picture a starting point for understanding who could move a constrained wholesale market.