The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
You can use U.S. Department of Labor PERM disclosure data to count employers associated with a city, but the result depends on which location field you choose and whether you count distinct employers or individual cases. The latest release listed by OFLC on October 7, 2026 was FY2026 Q3, covering determinations issued from October 1, 2025 through June 30, 2026.
What a “PERM sponsor by city” count actually measures
PERM disclosure files are administrative application data, not a census of every employer sponsoring a worker or a directory of current openings. OFLC describes them as selected information extracted from application tables. A published count therefore means “records in this release matching this location field and counting rule,” not “all companies sponsoring workers in this city.”
First decide what “city” means for your question. An employer-address city can differ from the location of the job opportunity or worksite. Do not assume a city field represents headquarters, work location, or another geographic concept based on its label alone: confirm its meaning in the record layout that accompanies the exact file you use.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Fix the driver behind crashes, sound loss and screen glitches3Clear out junk files and repair common Windows errors- Employer address city: use this when you want to group records by the employer location recorded in the relevant field.
- Job opportunity or worksite city: use this when you want to group by the place associated with the position, if that release provides an appropriate field.
- Counting unit: distinct employers answers how many employers appear; case records answer how many determinations or cases appear. One employer can have multiple records.
If the layout provides a state field, group by city and state together. City names alone may refer to different places, and similar-looking names should not be merged without a defensible geographic matching method.
#1 Best Overall
Download the correct PERM file and layout
Get the disclosure workbook and its matching Program Record Layout from the OFLC Performance Data page. OFLC publishes PERM workbooks in Excel format and organizes the files by federal fiscal year. The record layout is essential: it describes fields and helps establish what a location column represents.
As listed on October 7, 2026, FY2026 Q3 was the latest quarterly PERM release. OFLC says it covers determinations issued between October 1, 2025 and June 30, 2026. The federal fiscal year runs October 1 through September 30, so the quarter label and the actual determination window should both be recorded in your output.
Before coding, open the matching layout and identify the exact employer identifier, location field, and any state field. Field names and meanings are release-specific; verify them in the downloadable layout rather than copying a guessed name into a script.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Rank #2
Inspect the workbook before choosing columns
The source guarantees an .xlsx workbook, but the exact sheet and column names must be checked in the downloaded release. This short Python inspection uses pandas and openpyxl; it prints sheet names, column headings, sample records, and the proportion of blank values in each column.
import pandas as pd
path = "path/to/perm_workbook.xlsx"
book = pd.ExcelFile(path, engine="openpyxl")
print("Sheets:", book.sheet_names)
for sheet in book.sheet_names:
df = pd.read_excel(path, sheet_name=sheet, engine="openpyxl")
print(f"nSheet: {sheet}")
print("Columns:", df.columns.tolist())
print(df.head(3).to_string(index=False))
print("Blank share by column:")
print(df.isna().mean().sort_values(ascending=False).to_string())
Use this inspection to match the workbook to the record layout, not to infer field semantics from sample values. If the file has multiple sheets, determine which one contains the records described by the layout before calculating counts.
Count distinct employers by the verified city field
After checking the layout, replace the example column-name strings below with the exact column names in your workbook. Set the location field to employer city or job/worksite city according to your question. Set the employer identifier to the field that identifies an employer in that release. Do not run the aggregation with these example names unchanged.
import pandas as pd
# Read the worksheet identified from the workbook inspection.
df = pd.read_excel(
"path/to/perm_workbook.xlsx",
sheet_name="replace with verified sheet name",
engine="openpyxl",
)
# Replace each string with its exact header from this release's layout.
city_col = "replace with verified city field"
state_col = "replace with verified state field"
employer_col = "replace with verified employer identifier"
# Keep source values intact; use normalized copies only for grouping.
for col in (city_col, state_col):
df[col + "_normalized"] = df[col].astype("string").str.strip().str.casefold()
valid = df[city_col + "_normalized"].notna()
valid &= df[city_col + "_normalized"].ne("")
valid &= df[employer_col].notna()
counts = (
df.loc[valid]
.groupby([city_col + "_normalized", state_col + "_normalized"])[employer_col]
.nunique()
.rename("distinct_employers")
.reset_index()
.sort_values("distinct_employers", ascending=False)
)
print(counts.head(25).to_string(index=False))
This code trims surrounding whitespace and standardizes case for grouping, while leaving the original values in the DataFrame. It does not geocode or merge variants such as abbreviations, alternate spellings, or nearby municipalities. Those decisions require a separate, documented normalization method; otherwise, preserve the distinctions in the source.
Free tools Windows power users keep installed
One-click scans. No signup required.
For a case-record count instead of distinct employers, count rows per city/state after applying the same location-validity rule. Label that measure as cases or records, not sponsors. A single employer may then contribute more than one count.
Interpret the result and compare cities responsibly
Include enough detail for another reader to understand exactly what each number represents. For every table, chart, or exported file, state:
- the OFLC fiscal year and quarter, plus the determination window;
- the geographic field used, such as employer address city or job/worksite city, using the layout’s definition;
- whether the unit is distinct employers or case records, and which employer identifier defines distinctness;
- whether records with blank city values were excluded;
- the state grouping, if available, and any additional name-normalization rules.
For example, a result should be described as distinct employers in the selected employer-city and state fields among records in a named quarterly release—not as the number of all companies currently sponsoring workers there.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Limits that affect PERM city counts
OFLC says a fiscal-year dataset is cumulative and contains unique records identified by OFLC case number, based on the most recent date a determination decision was issued. The data combines information provided by employers with system-generated metadata, including receipt and decision dates. It is not a count of pending cases: records may be absent while cases are still being processed without final determinations. OFLC also omits some information that is personally identifiable or difficult to extract because it is open text.
Published records can contain blank fields and other anomalies from data-entry or application errors. OFLC cautions that determinations can change in later quarterly releases following appeals or redeterminations. For that reason, keep the release identifier with your results rather than treating a count as fixed.
Historical comparisons need extra care. OFLC says layouts changed substantially beginning with FY2020 as new forms, appendices, and addenda were implemented through FLAG. FY2024 includes separate files reflecting the old and new forms. Inspect each file’s layout and confirm that the fields remain comparable before combining years; otherwise, report periods separately.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

