समझिए
Foundations ट्रैक का सेल्स डेटा (Date, Salesperson, Region, Product, Amount) sales.xlsx की "Data" शीट में इस्तेमाल करेंगे।
1. पढ़ना
import pandas as pd
df = pd.read_excel("sales.xlsx", sheet_name="Data")
print(df.shape) # (rows, columns)
print(df.head()) # first 5 rows
print(df.dtypes) # type of each column
काम के विकल्प:
pd.read_excel("file.xlsx", sheet_name=None) # ALL sheets -> dict of DataFrames
pd.read_excel("file.xlsx", skiprows=3) # report has 3 title rows on top
pd.read_excel("file.xlsx", usecols="A:E") # only these columns
pd.read_excel("file.xlsx", dtype={"PIN": str}) # keep leading zeros
pd.read_csv("file.csv") # CSV
DataFrame एक टेबल है; एक कॉलम (df["Amount"]) Series है।
2. फ़िल्टर — AutoFilter की तरह
north = df[df["Region"] == "North"]
big_laptops = df[(df["Product"] == "Laptop") & (df["Amount"] > 50000)]
north_west = df[df["Region"].isin(["North", "West"])]
AND के लिए &, OR के लिए | इस्तेमाल करें, और हर शर्त ब्रैकेट में रखें।
query अंग्रेज़ी जैसा पढ़ा जाता है:
df.query("Amount >= 30000 and Region != 'West'")
3. नए कॉलम
df["GST"] = df["Amount"] * 0.18
df["Total"] = df["Amount"] + df["GST"]
df["Month"] = df["Date"].dt.to_period("M").astype(str) # "2026-04"
df["Name"] = df["Salesperson"].str.strip().str.title() # TRIM + PROPER
पूरा कॉलम एक साथ गणना होता है — न लूप, न फ़ॉर्मूला खींचना।
4. groupby — SUMIFS / पिवट टेबल की तरह
df.groupby("Salesperson")["Amount"].sum()
एक साथ कई टोटल, साफ़ टेबल के रूप में:
summary = (df.groupby("Region")
.agg(Orders=("Amount", "count"), Total=("Amount", "sum"), Average=("Amount", "mean"))
.reset_index()
.sort_values("Total", ascending=False))
| Region | Orders | Total | Average |
|---|---|---|---|
| South | 3 | 96000 | 32000 |
| North | 3 | 92000 | 30667 |
| West | 1 | 61000 | 61000 |
Excel पिवट जैसी क्रॉस-टेबल:
df.pivot_table(index="Region", columns="Product", values="Amount", aggfunc="sum", fill_value=0)
5. merge — XLOOKUP की तरह
products.xlsx में Product, Category, Cost है। हर सेल्स रो में Category और Cost लाएँ:
prod = pd.read_excel("products.xlsx")
merged = df.merge(prod, on="Product", how="left")
merged["Profit"] = merged["Amount"] - merged["Cost"]
| how= | क्या रखता है |
|---|---|
"left" |
हर सेल्स रो (मेल न खाने वाले लुकअप NaN बनते हैं) — XLOOKUP जैसा |
"inner" |
सिर्फ़ वे रो जो दोनों में हैं |
"outer" |
दोनों की सारी रो |
अगर key कॉलम के नाम अलग हों: left_on="Item", right_on="Product"।
6. कई फ़ाइलें जोड़ना
from pathlib import Path
files = Path("data").glob("*.xlsx")
all_data = pd.concat([pd.read_excel(f) for f in files], ignore_index=True)
concat टेबल को एक के ऊपर एक रखता है (कॉलम वही)।
7. झटपट सफ़ाई
df = df.drop_duplicates()
df = df.dropna(subset=["Amount"]) # remove rows with no amount
df["Date"] = pd.to_datetime(df["Date"], format="%d/%m/%Y", errors="coerce") # text dates → dates
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce") # "NA" → NaN instead of crashing
errors="coerce" गलत वैल्यू को खाली (NaT/NaN) बना देता है ताकि आप उन्हें ढूँढकर रिपोर्ट कर सकें।
आम गलतियाँ
फ़िल्टर में &/| की जगह and/or इस्तेमाल करना। हर शर्त के चारों ओर ब्रैकेट भूलना। भारतीय तारीख़ों के लिए format= या dayfirst=True न देना। अतिरिक्त स्पेस वाली key पर merge करना (पहले strip करें)।