import pandas as pd orders = pd.DataFrame( { "order_id": ["A100", "A101", "A102", "A103", "A104"], "customer": [ " Ada Lovelace ", "LIN CHEN", "Maya Patel", " n/a ", None, ], "status": [" Paid ", "PAID", " pending", "", pd.NA], } ) cleaned = orders.copy() cleaned["customer"] = ( cleaned["customer"] .astype("string") .str.strip() .str.replace(r"\s+", " ", regex=True) .replace({"n/a": pd.NA}) ) cleaned["status"] = ( cleaned["status"] .astype("string") .str.strip() .str.casefold() .replace({"": pd.NA, "n/a": pd.NA}) ) expected_customer = pd.Series( ["Ada Lovelace", "LIN CHEN", "Maya Patel", pd.NA, pd.NA], name="customer", dtype="string", ) expected_status = pd.Series( ["paid", "paid", "pending", pd.NA, pd.NA], name="status", dtype="string", ) assert len(cleaned) == len(orders) pd.testing.assert_series_equal(cleaned["customer"], expected_customer) pd.testing.assert_series_equal(cleaned["status"], expected_status) print(cleaned.to_string(index=False)) print() print(f"rows retained: {len(cleaned)}") print(f"missing customers: {cleaned['customer'].isna().sum()}") print(f"missing statuses: {cleaned['status'].isna().sum()}")