Data AnalyticsPortfolio projects with Indian public data

Higher-education GER and gender parity for NCR states from AISHE

PK
Pankit Kumar
Sr. Data Scientist at Parexel (a Goldman Sachs–backed company) · 27 September 2026 · 6 min read
In this article (8 sections)

Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).

The short answer

How many young people in Delhi, Haryana and Uttar Pradesh are enrolled in higher education, and are women enrolling at a higher or lower rate than men? The All India Survey on Higher Education (AISHE) final report for 2023-24 answers both. It puts Delhi's gross enrolment ratio (GER) for ages 18 to 23 at 53.0, Haryana's at 35.1 and UP's at 26.0, against 30.0 for India. Female GER is higher than male GER in all three. This project extracts those tables from the report, rebuilds a five-year trend, and tests the ratios before any state comparison, because a few published values exceed 100.

Getting the report

Go to aishe.gov.in, scroll to the Reports section and choose AISHE Final Report. On 27 September 2026 that page listed PDF final reports from 2019-20 to 2023-24 (the 2023-24 PDF is about 4 MB and 337 pages). It also linked separate "Excel" versions on he.nic.in for each year. We parsed the PDF. If you use the Excel version, check the downloaded file's header against the PDF tables before trusting it.

The tables used here are:

TableContentBreakdown
19State/UT-wise GER, ages 18 to 23All categories, SC, ST; male, female, total
20State/UT-wise gender parity index (GPI)All categories, SC, ST
47GER trends over the last five years2019-20 to 2023-24, same breakdown
48GPI trends over the last five years2019-20 to 2023-24

The report says that 2023-24 GER is calculated on population projections derived from the 2011 Census. That one sentence explains most of the oddities below.

Figures to reproduce first

From Tables 19 and 47 of the 2023-24 report:

StateMale GERFemale GERTotal GERTotal GER 2019-20
Delhi51.554.553.049.0
Haryana31.139.935.128.2
Uttar Pradesh25.027.126.022.5
All India28.931.230.025.6

Table 20 gives GPI (female GER divided by male GER) as 1.06 for Delhi, 1.28 for Haryana, 1.09 for UP and 1.08 for India. Delhi's total GER was 55.7 in 2022-23, so it fell in the latest year while Haryana's rose.

What goes wrong in extraction

  • Blank cells disappear. Text extraction from the PDF drops empty cells. Delhi and Haryana have no ST values in Table 19, so their rows carry six numbers instead of nine. A parser that assigns numbers by position will shift SC values into the ST columns without warning. Use the word coordinates to assign columns, or count the numbers per row and handle each count explicitly.
  • Ratios above 100. Mizoram's ST GER is printed as 200.3 and Meghalaya's as 149.4. GER divides all enrolled students, of any age, by an estimated population aged 18 to 23. Over-age students, students who move in from other states and an out-of-date population base can all push it past 100. Do not cap these values, but flag them and keep them out of rankings.
  • Rounding. Recomputing GPI from the rounded GERs gives 27.1 divided by 25.0, or 1.084, for UP, while Table 20 prints 1.09. The table was calculated from unrounded values. Use the published GPI and allow a tolerance of 0.01 when you check.
  • Name changes. "D & N Haveli and Daman & Diu" is one row, and names wrap across two lines in the PDF. Build a lookup table for state names.
  • Mixed year labels. Table 47 labels rows "2023-24", while the survey is sometimes cited by its first year. Store both the label and a start-year integer.

Code: parse, validate and flag on synthetic text

The rows below are synthetic. They imitate what text extraction produces, including a missing ST block and a value above 100, but the states and ratios are invented and are not AISHE figures.

python
import pandas as pd

extracted = [
    ["1", "State P", "30.2", "36.0", "33.0", "25.1", "31.0", "27.9", "20.0", "22.4", "21.2"],
    ["2", "State Q", "44.8", "47.1", "45.9", "33.0", "34.2", "33.6"],            # no ST students
    ["3", "State R", "22.5", "24.9", "23.7", "20.1", "24.0", "22.0", "118.0", "126.4", "122.0"],
    ["4", "State S", "39.0", "38.2", "38.6", "36.5", "38.8", "37.6", "30.1", "31.7", "30.9"],
]
published_gpi = {"State P": 1.19, "State Q": 1.05, "State R": 1.11, "State S": 0.98}

cols = [f"{grp}_{sex}" for grp in ("all", "sc", "st") for sex in ("m", "f", "t")]
rows = []
for rec in extracted:
    nums = [float(x) for x in rec[2:]]
    if len(nums) == 6:
        nums += [None, None, None]      # the ST block is blank, not shifted
    elif len(nums) != 9:
        raise ValueError(f"unexpected cell count for {rec[1]}: {len(nums)}")
    rows.append({"state": rec[1], **dict(zip(cols, nums))})
ger = pd.DataFrame(rows).set_index("state")

ger["gpi_recomputed"] = (ger["all_f"] / ger["all_m"]).round(3)
ger["gpi_published"] = pd.Series(published_gpi)
ger["gpi_check"] = (ger["gpi_recomputed"] - ger["gpi_published"]).abs().le(0.011).map({True: "ok", False: "CHECK"})
ger["flag"] = ger[["all_t", "sc_t", "st_t"]].gt(100).any(axis=1).map({True: "ratio above 100", False: ""})
ger["female_gap_pts"] = (ger["all_f"] - ger["all_m"]).round(1)

print(ger[["all_m", "all_f", "all_t", "st_t", "gpi_recomputed", "gpi_published", "gpi_check", "flag"]].to_string())
ranked = ger[ger["flag"] == ""].sort_values("all_t", ascending=False)
print("\nranking on unflagged rows:", list(ranked.index))

The explicit cell count is the important line. Without it, State Q's blank ST block would silently misalign, and a later row with a genuinely missing value would corrupt the table without an error. The GPI check passes because the tolerance allows for rounding, and a failure would point to a misread cell. State R stays in the table with its flag but drops out of the ranking.

Why employers care

Education companies, university admissions teams, state education departments and ed-tech investors use GER to size markets and track policy targets. Recruiters for analyst roles care more about the method. Extracting a table from a 337-page PDF, proving the parse is correct against the report's own totals and explaining a ratio above 100 are problems that appear in every organisation's document archive.

Analysis plan

  1. 1Download the 2023-24 PDF, record its size and page count, and locate Tables 19, 20, 47 and 48 by their captions.
  2. 2Parse each table with coordinate-aware extraction, apply the cell-count rule, and reproduce the figures above as assertions.
  3. 3Build a long panel of state, year, social group, sex and GER, plus the published GPI.
  4. 4Chart the five-year trend for Delhi, Haryana, UP and India, total and by sex.
  5. 5Rank states on 2023-24 total GER with flagged rows excluded, and list the flagged rows separately with the reason.
  6. 6Optionally add the 2022-23 report and check that its 2022-23 figures match the trend table in the 2023-24 report.

Deliverables

  • Slope chart: GER in 2019-20 and 2023-24 for the three NCR states and India, split by sex.
  • Parity table: state, male and female GER, published GPI, recomputed GPI, check result.
  • Flag table: every value above 100, with the population-base explanation.
  • README: report edition and table numbers, the extraction method, the cell-count rule, the 2011-based population note and the rounding tolerance.

Interview questions

  • How can a gross enrolment ratio exceed 100?
  • Your recomputed GPI differs from the published one by 0.01. Is that an error?
  • Delhi's GER fell by 2.7 points in a year. What would you check before calling it a decline in enrolment?
  • Why is it risky to parse a PDF table by position?

The UDISE pupil-teacher ratio project covers school education with a similar state comparison, and the PLFS female participation project follows women into the labour market. PDF extraction and validation are taught in our Data Analyst programme, live online with optional in-person labs at our Noida centre.

PK
Pankit Kumar
Lead Instructor, NeuraPath Academy

Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.

This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.

Explore Data Analytics with Generative AI
Counselling is free · no obligation

Not sure which programme fits?

Tell us your background and we will map it to the right entry point — including saying so when a cheaper programme is the better fit. A counsellor replies within one working day.