طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 14 · الوحدة 7: جمع البيانات من مصادر متعددة

التسلسل concat وتعدد المصادر

ملفٌّ لكل شهر، مصدرٌ لكل منصّة؛ كيف نكدّسها في جدولٍ واحد نحلّله؟ ⏱ نحو 35 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تكدّس صفوف جداول متماثلة بـ concat.
  • تعيد ترقيم الفهرس بـ ignore_index.
  • تحمل هوية المصدر بعمودٍ مميّز.
  • تحذر فجوات الأعمدة غير المتطابقة.

١بيانات من عدة مصادر

كثيرًا ما تأتي البيانات مقسّمة: ملف لكل شهر، أو مصدر لكل منصّة. merge يربط أعمدة جدولين مختلفين، أما concat فيكدّس صفوف جداول لها البنية نفسها — كأنك تلحق ملفًّا بآخر.

main.py
import pandas as pdjan = pd.DataFrame({"page": ["home", "cart"], "visits": [1200, 430]})feb = pd.DataFrame({"page": ["home", "cart"], "visits": [1500, 510]}) # كدّس صفوف الشهرينallm = pd.concat([jan, feb], ignore_index=True)print(allm)print("إجمالي الصفوف:", len(allm))
Shell×
>>> %Run main.py
page visits
0 home 1200
1 cart 430
2 home 1500
3 cart 510
إجمالي الصفوف: 4
>>>

ignore_index=True يعيد ترقيم الفهرس 0,1,2… بدل تكرار فهارس كل جدول. مهمّ كي لا تتعارض الفهارس.

٢حمل هوية المصدر

بعد التكديس نفقد معرفة مصدر كل صفّ. الحلّ: أضف عمودًا يميّز المصدر قبل الدمج:

main.py
import pandas as pdjan = pd.DataFrame({"page": ["home", "cart"], "visits": [1200, 430]})feb = pd.DataFrame({"page": ["home", "cart"], "visits": [1500, 510]}) jan["month"] = "jan"feb["month"] = "feb"allm = pd.concat([jan, feb], ignore_index=True) # الآن نحلّل حسب الشهرprint(allm.groupby("month")["visits"].sum())
Shell×
>>> %Run main.py
month
feb 2010
jan 1630
Name: visits, dtype: int64
>>>

هكذا يجتمع concat (للجمع) مع groupby (للتحليل): كدّس المصادر، ثم حلّل حسب عمود المصدر.

٣حذر: الأعمدة غير المتطابقة

إن اختلفت أعمدة الجداول، يملأ concat الفجوات بـ NaN. تحقّق من تطابق الأعمدة قبل التكديس:

main.py
import pandas as pda = pd.DataFrame({"page": ["home"], "visits": [100]})b = pd.DataFrame({"page": ["cart"], "clicks": [50]})   # عمود مختلف! mixed = pd.concat([a, b], ignore_index=True)print(mixed)        # فجوات NaN حيث لا يوجد العمودprint("أعمدة مفقودة؟ عدد NaN:", int(mixed.isna().sum().sum()))
Shell×
>>> %Run main.py
page visits clicks
0 home 100.0 NaN
1 cart NaN 50.0
أعمدة مفقودة؟ عدد NaN: 2
>>>

توقّع وتحقّق

لتكديس صفوف جداول متماثلة البنية:

لإعادة ترقيم الفهرس بعد التكديس:

concat لجداول مختلفة الأعمدة ينتج:

الفرق: merge يربط ... و concat يكدّس ...:

الخلاصة

تحدٍّ برمجي: اجمع مصدرين

متوسط

كدّس جدولي منصّتين بعد وسم كلٍّ بمصدره، ثم اطبع إجمالي الصفوف، وإجمالي زيارات منصّة web.

المطلوب:
  • أضف عمود source لكل جدول ثم كدّس بـ concat.
  • اطبع عدد الصفوف، ثم مجموع visits حيث source == "web".

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
import pandas as pdweb = pd.DataFrame({"page": ["home", "cart"], "visits": [900, 300]})app = pd.DataFrame({"page": ["home", "cart"], "visits": [700, 450]})# وسم المصدر، كدّس، ثم اطبع عدد الصفوف ومجموع زيارات web
المطلوب×
4
1200
💡 تلميح 1
وسم ثم كدّس: pd.concat([web, app], ignore_index=True).
💡 تلميح 2
رشّح واجمع زيارات web.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
import pandas as pdweb = pd.DataFrame({"page": ["home", "cart"], "visits": [900, 300]})app = pd.DataFrame({"page": ["home", "cart"], "visits": [700, 450]})web["source"] = "web"app["source"] = "app"allp = pd.concat([web, app], ignore_index=True)print(len(allp))print(int(allp[allp["source"] == "web"]["visits"].sum()))
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس