import pandas as pd
import geopandas as gpd
import re
df = pd.read_csv('2020_Neighborhood_Tabulation_Areas_(NTAs)_20251129.csv')
df["geometry"] = gpd.GeoSeries.from_wkt(df["the_geom"])
ntas = gpd.GeoDataFrame(df, geometry="geometry", crs="EPSG:4326")
ntas
ntas.info()
rent = pd.read_csv('medianAskingRent_OneBd.csv')
rent
clean the borough names we will join on
def normalize_rent_name(s: str) -> str:
if pd.isna(s):
return s
s = s.lower().strip()
if "/" in s:
s = s.split("/")[0]
# collapse whitespace
s = re.sub(r"\s+", " ", s)
return s
def normalize_nta_name(s: str) -> str:
if pd.isna(s):
return s
s = s.lower().strip()
# remove anything in parentheses:
s = re.sub(r"\s*\(.*?\)", "", s)
# take only the first neighborhood before a hyphen
if "-" in s:
s = s.split("-")[0]
# Collapse whitespace
s = re.sub(r"\s+", " ", s)
return s
rent["join_name"] = rent["areaName"].apply(normalize_rent_name)
ntas["join_name"] = ntas["NTAName"].apply(normalize_nta_name)
ntas_rent = ntas.merge(
rent[["join_name", "2025-10"]],
on="join_name",
how="left",
)
vis = ntas_rent.explore(
column="2025-10",
cmap="viridis",
scheme="Quantiles",
k=5,
legend=True,
tiles="CartoDB positron",
tooltip=["NTAName", "BoroName", "2025-10"],
)
vis
Open interactive map in a new tab