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