إنشاء MultiIndex
أنشئ فهرسًا هرميًا للصفوف باستخدام pd.MultiIndex.from_tuples أو set_index على عدة أعمدة، وافحص مستوياته.
إنشاء MultiIndex درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ما هو MultiIndex؟
يتيح MultiIndex (ويُسمى أيضًا الفهرس الهرمي) أن يحتوي DataFrame أو Series في Pandas على مستويات متعددة من تسميات الصفوف. فكّر فيه على أنه مفتاح مركب في قاعدة بيانات: فبدل تحديد الصف بتسمية واحدة، تحدده بواسطة صفيف مثل (country, city) أو (year, quarter). وتُعد MultiIndexes أساسية لتمثيل البيانات اللوحية، والسلاسل الزمنية المقطعية، وأي مجموعة بيانات ذات بنية تجميع طبيعية من مستويين.
import pandas as pd
# A simple example: sales by country and city
data = {
'sales': [100, 200, 150, 300, 80, 120]
}
index = pd.MultiIndex.from_tuples(
[('USA', 'New York'), ('USA', 'Chicago'),
('UK', 'London'), ('UK', 'Manchester'),
('DE', 'Berlin'), ('DE', 'Munich')],
names=['country', 'city']
)
df = pd.DataFrame(data, index=index)
print(df)إنشاء MultiIndex باستخدام from_tuples
تُعد pd.MultiIndex.from_tuples(list_of_tuples, names=) الطريقة الأكثر وضوحًا لإنشاء MultiIndex. يصبح كل صفيف تسميةً لصف واحد، وتصبح عناصره المستويات. وتعيّن المعلمة names تسميةً لكل مستوى (مثل ['year', 'quarter']). وتفيد هذه الطريقة عندما تكون لديك قائمة مُعدة مسبقًا من المفاتيح المركبة التي تريد استخدامها فهرسًا للصفوف.
import pandas as pd
# Multi-level time index: year x quarter
tuples = [
(2022, 'Q1'), (2022, 'Q2'), (2022, 'Q3'), (2022, 'Q4'),
(2023, 'Q1'), (2023, 'Q2'), (2023, 'Q3'), (2023, 'Q4')
]
mi = pd.MultiIndex.from_tuples(tuples, names=['year', 'quarter'])
revenue = [120, 135, 145, 160, 130, 148, 162, 175]
df = pd.Series(revenue, index=mi, name='revenue_M')
print(df)إنشاء MultiIndex باستخدام from_product
تنشئ pd.MultiIndex.from_product(iterables, names=) كائن MultiIndex من الجداء الديكارتي لقوائم متعددة — أي من كل تركيبة ممكنة لعناصر القوائم المُدخلة. وهذه هي الطريقة الأنسب عندما ينبغي أن توجد جميع تركيبات المستويات في بياناتك. فعلى سبيل المثال، يؤدي إنشاء جميع تركيبات 3 سنوات × 4 أرباع × 5 مناطق إلى إنشاء لوحة متوازنة من 60 صفًا تلقائيًا.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
# Cartesian product: 3 years x 4 quarters = 12 combinations
mi = pd.MultiIndex.from_product([years, quarters], names=['year', 'quarter'])
print('Number of index entries:', len(mi))
print('First 6 entries:', mi[:6].tolist())
# Create a DataFrame with this index
df = pd.DataFrame({'revenue': np.random.randint(100, 200, 12)}, index=mi)
print('\n', df.head())إنشاء MultiIndex باستخدام set_index
الطريقة الأكثر شيوعًا لإنشاء MultiIndex عمليًا هي البدء بـ DataFrame عادي يحتوي على أعمدة التجميع، ثم استدعاء df.set_index([col1, col2]). يؤدي ذلك إلى ترقية هذه الأعمدة من أعمدة بيانات إلى مستويات فهرس. وتكون النتيجة مماثلة لما ستحصل عليه إذا أنشأت الفهرس من البداية باستخدام from_tuples، لكنها لا تتطلب سوى سطر واحد انطلاقًا من بيانات جدولية.
import pandas as pd
# Start with a flat DataFrame
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK', 'DE', 'DE'],
'year': [2022, 2023, 2022, 2023, 2022, 2023],
'gdp_bn': [25000, 26000, 3100, 3200, 4200, 4350]
})
# Promote two columns to a MultiIndex
df = df_flat.set_index(['country', 'year'])
print(df)
print('\nIndex type:', type(df.index).__name__)
print('Index names:', df.index.names)فحص مستويات MultiIndex
يخزن MultiIndex بياناته في مستويات (القيم الفريدة في كل مستوى) ورموز (مؤشرات صحيحة إلى مصفوفات المستويات). افحص المستويات باستخدام df.index.levels أو df.index.get_level_values(level). استخدم df.index.nlevels للتحقق من عدد المستويات الموجودة. وتسرد السمة names الاسم المعيّن لكل مستوى — عيّن هذه الأسماء باستخدام df.index.set_names(['level0', 'level1']).
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK'],
'year': [2022, 2023, 2022, 2023],
'gdp': [25000, 26000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year'])
print('Number of levels:', df.index.nlevels)
print('Level names:', df.index.names)
print('Level 0 values:', df.index.get_level_values(0).tolist())
print('Level 1 values:', df.index.get_level_values(1).tolist())
print('Unique level 0:', df.index.get_level_values('country').unique().tolist())MultiIndex في الأعمدة
يمكن أيضًا تطبيق MultiIndex على الأعمدة، مما ينشئ تسلسلًا هرميًا لتسميات الأعمدة. ويشيع ذلك عند تخزين مقاييس متعددة لكل فئة في تخطيط يشبه الجداول المحورية — مثل (revenue, Q1)، و(revenue, Q2)، و(cost, Q1)، و(cost, Q2). يمكنك الوصول إلى الأعمدة باستخدام MultiIndex بالطريقة نفسها التي تصل بها إلى الصفوف — باستخدام الصفائف. أنشئ MultiIndex للأعمدة باستخدام pd.MultiIndex.from_product وعيّنه إلى df.columns.
import pandas as pd
import numpy as np
# Create a DataFrame with MultiIndex columns
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
col_index = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
data = np.random.randint(50, 200, size=(3, 8))
df = pd.DataFrame(data, columns=col_index, index=['USA', 'UK', 'DE'])
df.index.name = 'country'
print(df)MultiIndex بعد تجميع GroupBy
عند استدعاء groupby([col1, col2]).agg(...)، يحتوي DataFrame الناتج على MultiIndex في صفوفه (إذ يصبح مفتاحا groupby مستويي الفهرس) وربما MultiIndex في أعمدته (إذا جمّعت مقاييس متعددة). وهذه هي الطريقة الأكثر شيوعًا لمواجهة MultiIndex في تحليل البيانات اليومي — لذا فإن فهم كيفية التنقل فيه ضروري للعمل مع نتائج groupby.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
# Two-key groupby creates a MultiIndex on rows
result = tips.groupby(['day', 'time'])['total_bill'].agg(['mean', 'count'])
print(result)
print('\nIndex type:', type(result.index).__name__)
print('Index names:', result.index.names)تبديل المستويات وإعادة ترتيبها
استخدم df.swaplevel() لتبديل مستويي فهرس، واستخدم df.reorder_levels([...]) لتغيير ترتيب جميع المستويات. وتفيد إعادة الترتيب عندما تريد تقسيم البيانات أولًا حسب مستوى داخلي، أو عندما يكون ترتيب مستويات الفهرس مختلفًا بين DataFrame وآخر ويجب محاذاتهما قبل الدمج. وبعد إعادة الترتيب، استدعِ دائمًا sort_index() لاستعادة الترتيب المعجمي من أجل إجراء التقسيم بكفاءة.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('Original levels:', result.index.names)
# Swap so time is the outer level
swapped = result.swaplevel().sort_index()
print('\nSwapped levels:', swapped.index.names)
print(swapped.head())التحقق من MultiIndex وترتيبه
لا يكون التقسيم داخل MultiIndex فعالًا إلا عندما يكون الفهرس مرتبًا معجميًا. تحقّق من ترتيب الفهرس باستخدام df.index.is_monotonic_increasing. فإذا أعاد False، رتّبه باستخدام df.sort_index(). ويؤدي MultiIndex غير المرتب إلى ظهور PerformanceWarning عند إجراء عمليات التقسيم، وقد يعيد نتائج غير صحيحة في بعض الحالات الحدّية — لذا رتّب الفهرس دائمًا بعد إنشاء MultiIndex أو تعديله.
import pandas as pd
# Create an unsorted MultiIndex deliberately
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=mi)
print('Is sorted:', df.index.is_monotonic_increasing)
print('Before sorting:')
print(df)
df_sorted = df.sort_index()
print('\nAfter sorting:')
print(df_sorted)
print('Is sorted:', df_sorted.index.is_monotonic_increasing)إعادة تعيين MultiIndex إلى أعمدة
استدعِ df.reset_index() لتحويل جميع مستويات الفهرس مرة أخرى إلى أعمدة عادية، مع ترك DataFrame بفهرس RangeIndex صحيح بسيط. يُعد هذا نمطًا شائعًا بعد عمليات التجميع باستخدام groupby: احسب الملخص المُجمّع باستخدام MultiIndex، ثم أعد ضبط الفهرس للحصول على DataFrame مسطّح مناسب لمزيد من عمليات Pandas أو الدمج أو التصدير إلى CSV. استخدم reset_index(level='name') لإعادة ضبط مستوى واحد فقط من فهرس مكوّن من مستويين.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('MultiIndex result:')
print(result.head(4))
# Flatten back to a regular DataFrame
flat = result.reset_index()
print('\nFlattened DataFrame:')
print(flat.head(4))
print('Index type:', type(flat.index).__name__)متى تستخدم MultiIndex
استخدم MultiIndex عندما تكون بياناتك ذات بنية هرمية طبيعية، مثل السلاسل الزمنية ذات الدقة الأقل من يوم (التاريخ + الساعة)، أو بيانات اللوحات (الكيان + الفترة الزمنية)، أو التجميعات المتداخلة (الدولة + المنطقة + المدينة). تجنّب استخدام MultiIndex مع مفاتيح تجميع بسيطة مكوّنة من عمودين، عندما يكون DataFrame المسطّح ذو الأعمدة المنفصلة سهل القراءة بالقدر نفسه. إذا وجدت نفسك تستدعي reset_index() باستمرار لمجرد الوصول إلى البيانات، فهذه علامة على أن MultiIndex لا يضيف قيمة إلى سير عملك.
تحقق سريع
اختبر مدى فهمك لإنشاء MultiIndex مما ورد في هذا الدرس.
مراجعة الدرس
تعلّمت في هذا الدرس أن MultiIndex يوفر تسميات هرمية للصفوف (أو الأعمدة) باستخدام الصفوف، ويمكن إنشاؤه باستخدام from_tuples أو from_product أو set_index على أعمدة متعددة، كما يجب ترتيبه دائمًا لضمان إجراء التقطيع بكفاءة. بعد ذلك سنستكشف كيفية تحديد البيانات من MultiIndex باستخدام .loc والصفوف والتقطيعات والمساعد IndexSlice.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «إنشاء MultiIndex» مجاني؟
نعم — نص درس «إنشاء MultiIndex» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء MultiIndex»؟
أنشئ فهرسًا هرميًا للصفوف باستخدام pd.MultiIndex.from_tuples أو set_index على عدة أعمدة، وافحص مستوياته. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «إنشاء MultiIndex»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.