الدرس 5 من 8
Pandas: التحويل والتجميع
هنا بتبدأ تطلع إجابات حقيقية من الداتا.
أعمدة جديدة
import pandas as pd df = pd.read_csv("orders.csv") df["revenue"] = df["qty"] * df["price"] # vectorized, like NumPy df["date"] = pd.to_datetime(df["date"]) # text -> real date df["month"] = df["date"].dt.month_name() df["is_big"] = df["revenue"] >= 2000 print(df[["product", "revenue", "month", "is_big"]].head(4))
الترتيب
import pandas as pd df = pd.read_csv("orders.csv") df["revenue"] = df["qty"] * df["price"] top3 = df.sort_values("revenue", ascending=False).head(3) print(top3[["product", "city", "revenue"]])
groupby: أهم دالة في Pandas
الفكرة ٣ خطوات: قسّم الداتا لمجموعات (مثلاً حسب المدينة)، طبّق حساب على كل مجموعة (مثلاً اجمع الإيراد)، واجمع النتايج في جدول واحد. اسمها Split-Apply-Combine.
import pandas as pd df = pd.read_csv("orders.csv") df["revenue"] = df["qty"] * df["price"] by_city = df.groupby("city")["revenue"].sum().sort_values(ascending=False) print(by_city)
ولو عايز أكتر من حساب مرة واحدة، استخدم agg:
import pandas as pd df = pd.read_csv("orders.csv") df["revenue"] = df["qty"] * df["price"] summary = df.groupby("category").agg( orders=("order_id", "count"), revenue=("revenue", "sum"), avg_rating=("rating", "mean"), ).round(2) print(summary)
جدول محوري (Pivot Table)
لو استخدمت Pivot Table في Excel قبل كده، دي نفس الفكرة: صفوف لحاجة، وأعمدة لحاجة تانية، والخانات فيها رقم محسوب.
import pandas as pd df = pd.read_csv("orders.csv") df["revenue"] = df["qty"] * df["price"] table = df.pivot_table(index="city", columns="category", values="revenue", aggfunc="sum", fill_value=0) print(table)
دمج جدولين (merge)
الداتا الحقيقية بتبقى متفرقة: جدول أوردرات وجدول تاني فيه تكلفة كل منتج. merge بتربطهم بعمود مشترك، زي VLOOKUP في Excel بس أقوى.
import pandas as pd df = pd.read_csv("orders.csv") costs = pd.DataFrame({ "category": ["Electronics", "Fashion", "Home"], "margin": [0.15, 0.40, 0.25], # profit margin per category }) merged = df.merge(costs, on="category", how="left") merged["profit"] = merged["qty"] * merged["price"] * merged["margin"] print(merged.groupby("category")["profit"].sum())
💡 apply للحالات الخاصةلو محتاج منطق مش موجود كدالة جاهزة،
df["col"].apply(my_function) بتطبق دالتك على كل قيمة. بس جرب الأول الحل الـ vectorized لأنه أسرع بكتير.