How to Find the Most Expensive Streets in England and Wales With Python
On this page
Problem statement
"The most expensive street in the country" is a perennial headline, and HM Land Registry's Price Paid Data can answer it for England and Wales from every recorded sale. The answer depends on choices that headlines rarely state. Street names repeat across the country and so must be paired with a place. A single mansion sale can top a ranking of medians from one sale. Non-standard transactions distort it. And the ranking for one year differs from one over several.
This page ranks the streets of England and Wales by median sale price in 2024 from the Price Paid file. It defines a street by name and postcode district, sets a minimum number of sales, compares rankings by median and by mean, and shows how the result changes with the threshold.
Quick answer
Group standard sales by street and postcode district, require a minimum number of sales, and rank by median:
A["district_pc"] = A.postcode.str.split(" ").str[0]
S = A.dropna(subset=["street"]).groupby(["street", "district_pc", "town"]).price.agg(sales="size", median="median", mean="mean").reset_index()
top = S[S.sales >= 5].nlargest(10, "median")
print(f"street-district combinations: {len(S):,}; with 5 or more sales: {(S.sales >= 5).sum():,}")
print(top[["street", "district_pc", "town", "sales", "median"]].to_string(index=False))
street-district combinations: 338,089; with 5 or more sales: 30,146
street district_pc town sales median
PARK CRESCENT W1B LONDON 5 7900000.0
GROSVENOR SQUARE W1K LONDON 5 7850000.0
THE BISHOPS AVENUE N2 LONDON 6 6750000.0
CURZON STREET W1J LONDON 11 6749970.0
MULBERRY SQUARE SW1W LONDON 18 6662500.0
NEW OXFORD STREET WC1A LONDON 7 6300000.0
AYBROOK STREET W1U LONDON 13 5975000.0
MARRYAT ROAD SW19 LONDON 5 5075000.0
KNIGHTSBRIDGE SW7 LONDON 5 4800000.0
QUEENSWAY W2 LONDON 58 4253000.0
The sales fall on 338,089 street and postcode-district combinations, only 30,146 of them with five or more sales. Among those, Park Crescent in W1B tops the ranking at a median of Β£7,900,000, ahead of Grosvenor Square and The Bishops Avenue. The whole top 10 is in London. Queensway in W2 makes the list with 58 sales, far more than any other street in it.
A minimum number of sales, median against mean, top streets
1. Why a minimum number of sales
Without a threshold, the top of the ranking is single sales:
one = S.nlargest(5, "median")
print(f"top 5 with no minimum: sales counts {one.sales.tolist()}; medians Β£{one['median'].min():,.0f} to Β£{one['median'].max():,.0f}")
for k in (3, 5, 10):
best = S[S.sales >= k].nlargest(1, "median").iloc[0]
print(f"minimum {k:>2} sales: top street {best.street.title()}, {best.district_pc} ({int(best.sales)} sales, median Β£{best['median']:,.0f})")
top 5 with no minimum: sales counts [3, 1, 1, 2, 1]; medians Β£18,750,000 to Β£36,750,000
minimum 3 sales: top street Grosvenor Place, SW1X (3 sales, median Β£36,750,000)
minimum 5 sales: top street Park Crescent, W1B (5 sales, median Β£7,900,000)
minimum 10 sales: top street Curzon Street, W1J (11 sales, median Β£6,749,970)
Without a minimum, the top five rest on one to three sales each, with medians from Β£18.75 million to Β£36.75 million. With a minimum of 3 sales Grosvenor Place leads, with 5 Park Crescent, with 10 Curzon Street: each threshold names a different "most expensive street".
2. Median against mean
t5 = S[S.sales >= 5]
key = lambda d: set(zip(d.street, d.district_pc))
top_med, top_mean = t5.nlargest(20, "median"), t5.nlargest(20, "mean")
print(f"streets in both top-20 lists: {len(key(top_med) & key(top_mean))} of 20")
print(f"largest mean-to-median ratio in the top 20 by mean: {(top_mean['mean'] / top_mean['median']).max():.1f}")
streets in both top-20 lists: 14 of 20
largest mean-to-median ratio in the top 20 by mean: 6.7
Ranked by mean instead, 6 of the top 20 streets change, and in one of them the mean is 6.7 times the median, pulled up by very large sales.
3. Where the top streets are
top50 = S[S.sales >= 5].nlargest(50, "median")
print("postcode areas of the top 50:", top50.district_pc.str.extract(r"^([A-Z]+)")[0].value_counts().head(6).to_dict())
print(f"top 50 outside London postcode areas (not E, EC, N, NW, SE, SW, W, WC): {(~top50.district_pc.str.extract(r'^([A-Z]+)')[0].isin(['E', 'EC', 'N', 'NW', 'SE', 'SW', 'W', 'WC'])).sum()}")
postcode areas of the top 50: {'W': 17, 'SW': 17, 'NW': 10, 'N': 1, 'WC': 1, 'OX': 1}
top 50 outside London postcode areas (not E, EC, N, NW, SE, SW, W, WC): 3
Of the top 50 streets with five or more sales, 17 are in W and 17 in SW postcodes, and 10 in NW. Only 3 are outside London's postcode areas.
The most expensive streets outside London
The data used on this page
HM Land Registry Price Paid Data for 2024, standard sales (category A), Β© Crown copyright 2026, Open Government Licence v3.0.
from pathlib import Path
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
CSV = Path("data/pp-2024.csv")
if not CSV.exists():
r = requests.get("http://prod1.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-2024.csv", timeout=1800); r.raise_for_status(); CSV.write_bytes(r.content)
COLS = ["transaction_id", "price", "date", "postcode", "property_type", "old_new", "duration", "paon", "saon",
"street", "locality", "town", "district", "county", "ppd_category", "record_status"]
A = pd.read_csv(CSV, header=None, names=COLS, usecols=["price", "postcode", "street", "town", "ppd_category"]).query("ppd_category == 'A'").dropna(subset=["postcode"]).copy()
print(f"{len(A):,} standard sales with a postcode")
763,740 standard sales with a postcode
There are 763,740 standard sales with a postcode.
Example 1: the most expensive streets outside London
LONDON = {"E", "EC", "N", "NW", "SE", "SW", "W", "WC"}
area = S.district_pc.str.extract(r"^([A-Z]+)")[0]
out = S[(S.sales >= 5) & ~area.isin(LONDON)].nlargest(5, "median")
print(out[["street", "district_pc", "town", "sales", "median"]].to_string(index=False))
street district_pc town sales median
PARK TOWN OX2 OXFORD 5 3100000.0
THE RIDGEWAY EN6 POTTERS BAR 6 2675000.0
KIPPINGTON ROAD TN13 SEVENOAKS 8 2602544.5
THE VINEYARD TW10 RICHMOND 6 2470000.0
MILL LANE SL6 MAIDENHEAD 5 2450000.0
Outside London, Park Town in Oxford leads at Β£3,100,000, followed by streets in Potters Bar, Sevenoaks, Richmond and Maidenhead.
Three choices behind a street ranking
A street ranking turns individual sales into a statistic per street, and its credibility rests on three choices. A street must be identified uniquely: names like High Street or Church Road appear thousands of times, so pair the name with a postcode district or town. The statistic must resist single sales: the median of at least five sales is a common minimum for published rankings, and even then a street of five sales in one year may be one development. And only standard sales belong in a ranking of what homes cost, since category B includes transfers to companies and bulk sales at prices that are not individual home prices.
With those choices made, the results say as much about the data as about the streets. The most expensive streets are concentrated in central London postcodes and a few commuter-belt areas, but the exact order moves from year to year with what happened to sell. Rankings over several years, or using a higher minimum, are more stable, and showing the number of sales next to each median lets readers judge each entry.
Spelling, flats and privacy
- Spelling: street names are upper case but can vary ("ST" vs "SAINT"); normalise before grouping.
- Flats: a block of new flats on one street can dominate its sales; check property types for top entries.
- Several years: pool 3 to 5 years of files for a more stable ranking of streets with few sales.
- Privacy: individual sale prices are public, but a ranking of medians reveals less about any one household than listing sales.
Internal links
- How to analyse HM Land Registry price paid data in Python β the data
- Fixing house price averages skewed by outliers β why medians
- How to map house prices by local authority in Python β the regional picture
FAQ
What is the most expensive street in England?
By 2024 median price of standard sales with at least five sales, the top streets are in central London postcode districts; the exact order depends on the threshold and the year.
How do I rank streets by house price in Python?
Group Price Paid sales by street and postcode district, require a minimum number of sales, and sort by median price.
Why use a minimum number of sales?
With one or two sales, a single expensive house decides a street's median.
Why combine street name with postcode district?
Street names repeat across the country; the postcode district makes each street unique.