20  Recipe: Clean Column Names

20.1 Task

Convert column names into lowercase identifiers separated by underscores.

def clean_column_names(df):
    """Return a copy with normalized column names."""
    result = df.copy()
    result.columns = (
        result.columns
        .str.strip()
        .str.lower()
        .str.replace(r"\s+", "_", regex=True)
        .str.replace(r"[^a-z0-9_]", "", regex=True)
    )
    return result

20.2 Example

import pandas as pd

raw = pd.DataFrame(columns=["City Name", "Total Value (%)"])
clean = clean_column_names(raw)

print(clean.columns.tolist())

20.3 Expected result

['city_name', 'total_value_']

Review the result because removing punctuation may create unclear or duplicated names.