التسلسل concat وتعدد المصادر
ملفٌّ لكل شهر، مصدرٌ لكل منصّة؛ كيف نكدّسها في جدولٍ واحد نحلّله؟ ⏱ نحو 35 دقيقة.
- تكدّس صفوف جداول متماثلة بـ
concat. - تعيد ترقيم الفهرس بـ
ignore_index. - تحمل هوية المصدر بعمودٍ مميّز.
- تحذر فجوات الأعمدة غير المتطابقة.
١بيانات من عدة مصادر
كثيرًا ما تأتي البيانات مقسّمة: ملف لكل شهر، أو مصدر لكل منصّة. merge يربط أعمدة جدولين مختلفين، أما concat فيكدّس صفوف جداول لها البنية نفسها — كأنك تلحق ملفًّا بآخر.
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))
ignore_index=True يعيد ترقيم الفهرس 0,1,2… بدل تكرار فهارس كل جدول. مهمّ كي لا تتعارض الفهارس.
٢حمل هوية المصدر
بعد التكديس نفقد معرفة مصدر كل صفّ. الحلّ: أضف عمودًا يميّز المصدر قبل الدمج:
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())
هكذا يجتمع concat (للجمع) مع groupby (للتحليل): كدّس المصادر، ثم حلّل حسب عمود المصدر.
٣حذر: الأعمدة غير المتطابقة
إن اختلفت أعمدة الجداول، يملأ concat الفجوات بـ NaN. تحقّق من تطابق الأعمدة قبل التكديس:
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()))
توقّع وتحقّق
لتكديس صفوف جداول متماثلة البنية:
لإعادة ترقيم الفهرس بعد التكديس:
concat لجداول مختلفة الأعمدة ينتج:
الفرق: merge يربط ... و concat يكدّس ...:
الخلاصة
concatيكدّس صفوف جداولٍ متماثلة البنية (بخلافmergeالذي يربط أعمدة).ignore_index=Trueيعيد ترقيم الفهرس كي لا يتكرّر.- أضف عمود مصدرٍ قبل التكديس كي لا تفقد منشأ كل صفّ.
- تكديس جداول مختلفة الأعمدة ينتج فجوات
NaN؛ وحّد البنية أولًا.
تحدٍّ برمجي: اجمع مصدرين
متوسطكدّس جدولي منصّتين بعد وسم كلٍّ بمصدره، ثم اطبع إجمالي الصفوف، وإجمالي زيارات منصّة web.
- أضف عمود
sourceلكل جدول ثم كدّس بـ concat. - اطبع عدد الصفوف، ثم مجموع
visitsحيثsource == "web".
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
import pandas as pdweb = pd.DataFrame({"page": ["home", "cart"], "visits": [900, 300]})app = pd.DataFrame({"page": ["home", "cart"], "visits": [700, 450]})# وسم المصدر، كدّس، ثم اطبع عدد الصفوف ومجموع زيارات web
💡 تلميح 1
pd.concat([web, app], ignore_index=True).💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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()))