दिन 13: GroupBy, Aggregation और Pivot Tables
✅ आज आप सीखेंगे
- Split → apply → combine
- sum, mean, count, nunique के साथ groupby
- agg() से named aggregations
- “Group का हिस्सा” के लिए transform
- Excel जैसा pivot_table और crosstab
🏢 असली दुनिया में
हर सोमवार regional manager माँगता है “region और category के हिसाब से revenue, orders और average bill, साथ में हर शहर का अपने region में हिस्सा”। groupby और pivot_table से यह weekly report Excel में पूरी दोपहर की जगह 10 lines में बनती है।
Split → apply → combine
import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales["revenue"] = sales["quantity"] * sales["unit_price"] * (1 - sales["discount"])
print(sales.groupby("region")["revenue"].sum().round())
print(sales.groupby("category")["rating"].mean().round(2).sort_values())एक साथ कई statistics
import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales["revenue"] = sales["quantity"] * sales["unit_price"] * (1 - sales["discount"])
report = sales.groupby("region").agg(
orders=("order_id", "count"),
cities=("city", "nunique"),
revenue=("revenue", "sum"),
avg_bill=("revenue", "mean"),
avg_rating=("rating", "mean"),
).round(1).sort_values("revenue", ascending=False)
print(report)import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales["revenue"] = sales["quantity"] * sales["unit_price"] * (1 - sales["discount"])
two = sales.groupby(["region", "category"])["revenue"].sum().round()
print(two.head(7))
print(two.unstack().fillna(0).astype(int)) # long -> widetransform – हर row रखें
agg हर group की एक row देता है। transform हर original row के लिए value देता है, ताकि हर row की उसके group से तुलना हो सके।
import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales["revenue"] = sales["quantity"] * sales["unit_price"] * (1 - sales["discount"])
city = sales.groupby(["region", "city"], as_index=False)["revenue"].sum()
city["share_of_region_%"] = (city["revenue"] / city.groupby("region")["revenue"].transform("sum") * 100).round(1)
print(city.sort_values(["region", "share_of_region_%"], ascending=[True, False]).to_string(index=False))import pandas as pd
st = pd.read_csv("students_performance.csv")
st["school_avg"] = st.groupby("school_type")["maths"].transform("mean").round(1)
st["above_school_avg"] = st["maths"] > st["school_avg"]
print(st[["student_id", "school_type", "maths", "school_avg", "above_school_avg"]].head())pivot_table – एक line में Excel pivot
import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales["revenue"] = sales["quantity"] * sales["unit_price"] * (1 - sales["discount"])
sales["month"] = pd.to_datetime(sales["order_date"]).dt.month
pv = pd.pivot_table(sales, index="category", columns="region", values="revenue",
aggfunc="sum", margins=True, margins_name="Total").round(-2)
print((pv / 1000).round(1)) # in ₹ thousandimport pandas as pd
import matplotlib.pyplot as plt
sales = pd.read_csv("sales_data.csv")
sales["revenue"] = sales["quantity"] * sales["unit_price"] * (1 - sales["discount"])
pv = pd.pivot_table(sales, index="category", columns="region", values="revenue", aggfunc="sum") / 100000
pv.plot(kind="bar", figsize=(9, 4.6))
plt.title("Revenue by category and region (₹ lakh)")
plt.ylabel("₹ lakh"); plt.xticks(rotation=0)
plt.show()
crosstab – counts और percentages
import pandas as pd
sales = pd.read_csv("sales_data.csv")
print(pd.crosstab(sales["region"], sales["payment_mode"]))
print((pd.crosstab(sales["region"], sales["payment_mode"], normalize="index") * 100).round(1))Region के हिसाब से Cash-on-Delivery का हिस्सा देखें। जिस region में COD ज़्यादा है वहाँ returns और cash संभालने का ख़र्च ज़्यादा – business वहाँ UPI cashback दे सकता है।
असली example: सोमवार की sales report
import pandas as pd
sales = pd.read_csv("sales_data.csv", parse_dates=["order_date"])
sales["revenue"] = sales["quantity"] * sales["unit_price"] * (1 - sales["discount"])
sales["quarter"] = "Q" + sales["order_date"].dt.quarter.astype(str)
q = sales.groupby("quarter").agg(orders=("order_id", "count"), revenue=("revenue", "sum"))
q["growth_%"] = (q["revenue"].pct_change() * 100).round(1)
q["revenue"] = (q["revenue"] / 1e5).round(2)
print(q.rename(columns={"revenue": "revenue_lakh"}))
top = (sales.groupby(["quarter", "product"])["revenue"].sum().reset_index()
.sort_values("revenue", ascending=False).groupby("quarter").head(1))
print(top.sort_values("quarter").to_string(index=False))🏅 आज के Job Skills
Practice tasks
🏋️ Practice – ख़ुद करें
Solution देखें
import pandas as pd
h = pd.read_csv("house_prices.csv")
print(pd.pivot_table(h, index="city", columns="furnishing", values="price_lakh", aggfunc="mean").round(1))Solution देखें
import pandas as pd
t = pd.read_csv("telecom_churn.csv")
t["churned"] = (t["churn"] == "Yes").astype(int)
print((t.pivot_table(index="contract", columns="internet_service", values="churned", aggfunc="mean") * 100).round(1))Solution देखें
import pandas as pd
st = pd.read_csv("students_performance.csv")
st["top"] = st["average"] >= 75
print((st.groupby("school_type")["top"].mean() * 100).round(1))
print(st.groupby(["school_type", "top"])["study_hours"].mean().round(2).unstack())Quick quiz
🧠 Quick Quiz – ख़ुद को जाँचें
Interview corner
💼 Interview Corner
groupby में agg, apply और transform का फ़र्क?
agg हर group की एक row देता है (sum, mean जैसे reductions)। transform original rows के साथ aligned result देता है (जैसे हर row पर group mean)। apply सबसे flexible है – हर group पर कोई भी function – पर सबसे धीमा।
pivot_table, pivot से कैसे अलग है?
pivot सिर्फ़ reshape करता है और index/column जोड़ी दो बार आए तो fail होता है। pivot_table duplicates को aggfunc (default mean) से aggregate करता है और margins से totals जोड़ सकता है।
सारांश
- groupby = split → apply → combine।
- Named outputs वाला agg साफ़ report tables बनाता है।
- transform हर row रखता है – shares और तुलना के लिए बढ़िया।
- pivot_table और crosstab Excel pivots एक line में बनाते हैं।
Day 14: merge, join और concat से tables जोड़ें – pandas के अंदर SQL joins जैसा।
