16. End-to-End Project: Blinkit Maharashtra
16.3 Clean
df = pd.read_csv("data/blinkit_maha_raw.csv")
df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
df["city"] = df["city"].astype(str).str.strip().str.title()
# Fix Sambhaji Nagar title-case edge cases if needed
df["city"] = df["city"].replace({"Sambhaji Nagar": "Sambhaji Nagar"})
df["status"] = df["status"].str.strip().str.title()
df["amount"] = (
df["amount"].astype(str).str.replace(",", "", regex=False)
)
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
df["order_date"] = pd.to_datetime(df["order_date"], dayfirst=True)
df.loc[df["delivery_mins"] > 120, "delivery_mins"] = np.nan
df["delivery_mins"] = df["delivery_mins"].fillna(df["delivery_mins"].median())
before = len(df)
df = df.drop_duplicates(subset=["order_id"], keep="first")
print("rows", before, "->", len(df), "null amounts", df["amount"].isna().sum())
df.to_csv("data/orders_clean.csv", index=False)
Pipeline order
- Load raw CSV.
- Normalise columns and city/status text.
- Parse amounts and dates (
dayfirst=True). - Fix impossible delivery minutes.
- Drop duplicate order_ids; log counts.
- Save
orders_clean.csv.