# 16.3 Data clean करूया

Source: https://ravindrabagale.com/mr/datascience/ch16-end-to-end-project-blinkit-maharashtra/16-3-clean.html
Language: mr (Marathi with English technical terms)

Raw CSV वाचून columns/text एकसारखे करा, amounts आणि dates parse करा, आणि या lab च्या नियमानुसार impossible minutes हाताळा:

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 चा क्रम

Raw CSV load करा.

Column names, city आणि status text normalise करा.

Amounts numeric आणि dates dayfirst=True वापरून parse करा.

Impossible delivery minutes दुरुस्त करा.

Duplicate order_ids काढून row counts नोंदवा.

orders_clean.csv save करा.

या generator मध्ये order_id unique आहे. Real line-level data मध्ये योग्य line key ठरवूनच duplicates हाताळा.

रवींद्र बागले यांची tip

Median भरल्यावर missing problem दिसेनाशी होते. किती 999 values बदलल्या ते बदल करण्याआधी मोजून cleaning log मध्ये लिहा.
