pd.merge: عمليات الربط الداخلي والخارجي
ادمج اثنين من DataFrame حسب عمود مفتاح مشترك باستخدام الربط الداخلي والخارجي، وافهم الصفوف التي تُبقى أو تُحذف.
pd.merge: عمليات الربط الداخلي والخارجي درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ما هو الربط؟
يجمع الربط بين DataFrames من خلال مطابقة الصفوف استنادًا إلى عمود مفتاح مشترك — وهو المفهوم نفسه لعبارة JOIN في SQL. يطبّق Pandas عمليات الربط من خلال pd.merge(). وعلى خلاف pd.concat() الذي يكدّس البيانات ببساطة، يعمل pd.merge() على محاذاة الصفوف بذكاء بين جدولين مختلفين استنادًا إلى القيم المتطابقة في عمود واحد أو عدة أعمدة.
عمود المفتاح المشترك
لكي تنجح عملية الدمج، يجب أن يحتوي كلا DataFrame على عمود واحد على الأقل يتضمن قيمًا مشتركة — ويُسمّى عمود المفتاح. على سبيل المثال، يحتوي جدول orders على عمود customer_id، ويحتوي جدول customers أيضًا على عمود customer_id. يؤدي الدمج باستخدام customer_id إلى إرفاق تفاصيل العميل بكل صف من صفوف الطلبات. حدّد المفتاح باستخدام معامل on عندما يشترك كلا DataFrame في اسم العمود نفسه.
import pandas as pd
orders = pd.DataFrame({
'order_id': [1, 2, 3, 4],
'customer_id': [101, 102, 101, 103],
'amount': [250, 80, 320, 150]
})
customers = pd.DataFrame({
'customer_id': [101, 102, 104],
'name': ['Alice', 'Bob', 'Diana']
})الربط الداخلي: تقاطع الجدولين
يحتفظ الربط الداخلي (وهو الافتراضي) بالصفوف التي توجد فيها قيمة المفتاح في كلا DataFrame معًا فقط. تُحذف الصفوف الموجودة في أي من الجدولين التي لا تملك مفتاحًا مطابقًا في الجدول الآخر بصمت. في مثال الطلبات، لا يوجد تطابق للعميلين 103 و104 في الجدول الآخر، ولذلك تُستبعد صفوفهما من نتيجة الربط الداخلي.
# Inner join (default): only matching rows from both
result = pd.merge(orders, customers, on='customer_id', how='inner')
print(result)
# order_id customer_id amount name
# 0 1 101 250 Alice
# 1 3 101 320 Alice
# 2 2 102 80 Bob
# Order 4 (customer 103) dropped - no match in customers
# Diana (customer 104) dropped - no match in ordersالربط الخارجي: اتحاد الجدولين
يحتفظ الربط الخارجي (how='outer') بجميع الصفوف من كلا DataFrame. عندما لا يملك صف ما مفتاحًا مطابقًا في الجدول الآخر، تُملأ الأعمدة المفقودة بالقيمة NaN. يكون ذلك مفيدًا عندما تريد الحصول على صورة كاملة لمجموعتي البيانات مع الحفاظ على السجلات التي لم تجد تطابقًا.
result = pd.merge(orders, customers, on='customer_id', how='outer')
print(result)
# order_id customer_id amount name
# 0 1.0 101 250.0 Alice
# 1 3.0 101 320.0 Alice
# 2 2.0 102 80.0 Bob
# 3 4.0 103 150.0 NaN <- order with unknown customer
# 4 NaN 104 NaN Diana <- customer with no ordersالدمج باستخدام أعمدة ذات أسماء مختلفة
عندما يختلف اسم عمود المفتاح في كل DataFrame، استخدم left_on وright_on بدلًا من on. يطابق Pandas الصفوف عندما تساوي قيمة left_on في DataFrame الأيسر قيمة right_on في DataFrame الأيمن. يظهر كلا عمودي المفتاح في النتيجة؛ ويمكنك حذف العمود الزائد لاحقًا.
products = pd.DataFrame({
'prod_id': [10, 20, 30],
'name': ['Widget', 'Gadget', 'Doohickey']
})
order_lines = pd.DataFrame({
'item_id': [10, 10, 20],
'qty': [3, 1, 5]
})
result = pd.merge(order_lines, products,
left_on='item_id', right_on='prod_id')
print(result.drop(columns='prod_id'))
# item_id qty name
# 0 10 3 Widget
# 1 10 1 Widget
# 2 20 5 Gadgetالدمج باستخدام عدة أعمدة
لمطابقة الصفوف بناءً على تركيبة من الأعمدة (مفتاح مركب)، مرّر قائمة إلى on. ويشيع ذلك عندما لا يكون عمود واحد كافيًا لإجراء مطابقة فريدة، مثل الدمج باستخدام كل من year وregion. يجب أن تتطابق جميع الأعمدة المدرجة في الوقت نفسه حتى يُضمَّن الصف في النتيجة.
targets = pd.DataFrame({
'year': [2023, 2023, 2024],
'region': ['East', 'West', 'East'],
'target': [100, 150, 120]
})
actuals = pd.DataFrame({
'year': [2023, 2024, 2024],
'region': ['East', 'East', 'West'],
'actual': [95, 115, 80]
})
result = pd.merge(targets, actuals, on=['year', 'region'], how='inner')
print(result)
# year region target actual
# 0 2023 East 100 95
# 1 2024 East 120 115التعامل مع أسماء الأعمدة المتداخلة
عندما يحتوي كلا DataFrame على عمود بالاسم نفسه (باستثناء المفتاح)، يضيف Pandas لواحق لتمييزهما. اللواحق الافتراضية هي _x (للجهة اليسرى) و_y (للجهة اليمنى). ويمكنك تخصيص هذه اللواحق باستخدام معامل suffixes لإنتاج أسماء أكثر دلالة وتجنب الالتباس في النتيجة.
df_a = pd.DataFrame({'id': [1, 2], 'value': [10, 20]})
df_b = pd.DataFrame({'id': [1, 2], 'value': [100, 200]})
# Default suffixes
print(pd.merge(df_a, df_b, on='id'))
# id value_x value_y
# Custom suffixes
print(pd.merge(df_a, df_b, on='id', suffixes=('_budget', '_actual')))
# id value_budget value_actualالتحقق من التكرارات غير المتوقعة
من المشكلات الشائعة في الدمج حدوث تضاعف غير متوقع للصفوف. إذا احتوى عمود المفتاح على قيم مكررة في كلا DataFrame، فإن الدمج ينتج حاصلًا ديكارتيًا لجميع الصفوف المتطابقة. تحقّق دائمًا من عدد الصفوف بعد الدمج: إذا كان أكبر مما توقعت، فابحث عن التكرارات في عمود المفتاح باستخدام df.duplicated(subset=['key']).sum().
# Both tables have duplicate keys -> cartesian product
left = pd.DataFrame({'id': [1, 1], 'val_l': ['a', 'b']})
right = pd.DataFrame({'id': [1, 1], 'val_r': ['x', 'y']})
result = pd.merge(left, right, on='id')
print(len(result)) # 4 rows! (2x2 cartesian product)
print(result)
# id val_l val_r
# 0 1 a x
# 1 1 a y
# 2 1 b x
# 3 1 b yمعامل validate للسلامة
مرّر معامل validate لفرض قيود العلاقات على عملية الدمج وإثارة خطأ عند انتهاكها. يتطلب 'one_to_one' مفاتيح فريدة في كلا الجدولين، بينما يتطلب 'one_to_many' مفاتيح فريدة في الجدول الأيسر فقط، ويتطلب 'many_to_one' مفاتيح فريدة في الجدول الأيمن فقط. تُعد هذه ممارسة ممتازة في البرمجة الدفاعية، إذ تكشف مشكلات جودة البيانات مبكرًا.
# Safe merge: validate that customer_id is unique in customers
try:
result = pd.merge(orders, customers,
on='customer_id',
how='inner',
validate='many_to_one')
print('Merge OK, shape:', result.shape)
except Exception as e:
print('Merge error:', e)التحقق من التغطية باستخدام indicator
مرّر indicator=True لإضافة عمود _merge إلى النتيجة يوضّح مصدر كل صف: 'left_only' أو 'right_only' أو 'both'. يكون ذلك مفيدًا بعد إجراء ربط خارجي لتحديد السجلات التي وجدت تطابقًا وتلك التي لم تجده، مما يساعدك على تدقيق جودة البيانات قبل حذف عمود المؤشر.
result = pd.merge(orders, customers, on='customer_id',
how='outer', indicator=True)
print(result['_merge'].value_counts())
# both 3
# left_only 1 <- orders with no customer record
# right_only 1 <- customers with no orders
# Find unmatched orders
print(result[result['_merge'] == 'left_only'])ملخص الربط الداخلي والخارجي
لتلخيص نوعَي الربط: يعطي الربط الداخلي التقاطع — أي الصفوف التي تملك مفاتيح مطابقة في كلا DataFrame فقط. ويعطي الربط الخارجي الاتحاد — أي جميع الصفوف من كلا DataFrame مع استخدام NaN عندما لا يوجد تطابق. وللاستكمال: يحافظ الربط الأيسر على جميع الصفوف من DataFrame الأيسر، ويحافظ الربط الأيمن على جميع الصفوف من DataFrame الأيمن. وسنتناول هذه الأنواع في الدرس التالي.
# Quick reference
# how='inner' -> intersection: only matched rows
# how='outer' -> union: all rows from both, NaN for no match
# how='left' -> all left rows + matched right rows
# how='right' -> all right rows + matched left rows
# Most common: inner (default) for enrichment, left for preserving recordsتحقق سريع
اختبروا مدى فهمكم للربطين الداخلي والخارجي باستخدام pd.merge مما ورد في هذا الدرس.
مراجعة الدرس
في هذا الدرس تعلّمتم أن pd.merge() مع how='inner' يحتفظ فقط بالصفوف المتطابقة من كلا DataFrame، بينما يحتفظ how='outer' بجميع الصفوف مع استخدام NaN للصفوف غير المتطابقة؛ ويحدد on المفتاح المشترك، بينما يتعامل left_on/right_on مع اختلاف أسماء الأعمدة؛ كما يساعد معامل indicator في تدقيق الصفوف المتطابقة. بعد ذلك، سنستكشف الربطين الأيسر والأيمن للحفاظ على جميع الصفوف من أحد الجانبين.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «pd.merge: عمليات الربط الداخلي والخارجي» مجاني؟
نعم — نص درس «pd.merge: عمليات الربط الداخلي والخارجي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «pd.merge: عمليات الربط الداخلي والخارجي»؟
ادمج اثنين من DataFrame حسب عمود مفتاح مشترك باستخدام الربط الداخلي والخارجي، وافهم الصفوف التي تُبقى أو تُحذف. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «pd.merge: عمليات الربط الداخلي والخارجي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- pd.concat لتكديس DataFrame
- pd.merge: عمليات الربط الداخلي والخارجي
- عمليات الربط اليسرى واليمنى
- الربط حسب الفهرس