تحديد البيانات من MultiIndex
استرجع البيانات من مستويات الفهرس الخارجية والداخلية باستخدام .loc مع الصفوف الجزئية والشرائح ومساعد pd.IndexSlice.
تحديد البيانات من MultiIndex درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
التنقل في البيانات الهرمية
بعد إنشاء MultiIndex، تحتاج إلى طرق فعّالة لاسترداد مجموعات فرعية من البيانات. يوفر Pandas ثلاث أدوات لذلك: .loc مع الصفوف لتحديد التسميات بدقة، وslice() وpd.IndexSlice لتحديد نطاقات عبر المستويات، و.xs() لتحديد مقطع عرضي عند قيمة محددة لأحد المستويات. إن إتقان أنماط الوصول هذه هو ما يتيح الاستفادة الكاملة من قوة الفهرسة الهرمية.
import pandas as pd
import numpy as np
# Setup: GDP data by country and year
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK','DE','DE','DE'],
'year': [2021, 2022, 2023, 2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200, 4100, 4200, 4350]
})
df = df_flat.set_index(['country', 'year']).sort_index()
print(df)التحديد حسب المستوى الخارجي باستخدام .loc
مرّر تسمية واحدة من المستوى الخارجي إلى .loc[] لاسترداد جميع الصفوف الخاصة بتلك المجموعة. باستخدام MultiIndex ذي مستويين (الدولة، السنة)، يعيد df.loc['USA'] جميع صفوف USA في صورة DataFrame، مع الإبقاء على الفهرس الداخلي فقط (السنة). يُسمى هذا السلوك إسقاط المستوى — فعند تحديد قيمة معيّنة في مستوى خارجي، يزيل Pandas ذلك المستوى من فهرس الكائن المُعاد.
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK'],
'year': [2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Select all USA rows
usa = df.loc['USA']
print('All USA rows:')
print(usa)
print('\nRemaining index type:', usa.index.name)تحديد صف معيّن باستخدام .loc
لاسترداد صف واحد محدد بمستويي الفهرس معًا، مرّر صفًا إلى .loc[]: df.loc[('USA', 2022)]. يعيد ذلك Series (أو قيمة مفردة عند تحديد عمود واحد) توافق تمامًا مجموعة التسميات (الخارجية، الداخلية) المحددة. يجب تمرير الصف داخل قائمة مثل df.loc[[('USA', 2022)]] إذا أردت الحصول على DataFrame بدلًا من Series.
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK'],
'year': [2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200],
'cpi': [3.2, 5.1, 4.8, 2.5, 3.4, 3.0]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Single row as Series
print('USA 2022 (Series):')
print(df.loc[('USA', 2022)])
# Single row as DataFrame
print('\nUSA 2022 (DataFrame):')
print(df.loc[[('USA', 2022)]])تحديد عدة صفوف باستخدام قائمة من الصفوف
لتحديد عدة صفوف معيّنة دفعة واحدة، مرّر قائمة من الصفوف إلى .loc[]. يفيد ذلك عندما تحتاج إلى مجموعة فرعية غير متجاورة من الصفوف المحددة بمفاتيح مركبة — مثل بيانات عام 2022 للولايات المتحدة والمملكة المتحدة دون ألمانيا. تحافظ النتيجة على MultiIndex في DataFrame المُعاد.
import pandas as pd
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]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Select specific (country, year) combinations
subset = df.loc[[('USA', 2022), ('UK', 2023), ('DE', 2022)]]
print(subset)التقطيع باستخدام pd.IndexSlice
يتيح لك pd.IndexSlice (الذي يُختصر عادةً إلى idx) كتابة تقطيعات نطاقية لمستويات MultiIndex دون إنشاء تقطيعات صفوف مطوّلة يدويًا. الصيغة: df.loc[idx[outer_slice, inner_slice], column_slice]. على سبيل المثال، يحدد df.loc[idx['UK':'USA', 2022:2023], :] جميع الصفوف التي يقع فيها المستوى الخارجي بين UK وUSA، والمستوى الداخلي بين 2022 و2023. يجب ترتيب الفهرس حتى يعمل ذلك بشكل صحيح.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
countries = ['DE', 'UK', 'USA']
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': np.random.randint(3000, 26000, 9)}, index=mi)
idx = pd.IndexSlice
# Select UK and USA for years 2022 and 2023
subset = df.loc[idx['UK':'USA', 2022:2023], :]
print(subset)الوصول إلى مقطع عرضي باستخدام .xs()
يحدد df.xs(key, level=) جميع الصفوف التي يساوي فيها مستوى محدد قيمة معينة، بغض النظر عن محتوى المستويات الأخرى. بخلاف .loc الذي يتطلب تحديد المستويات الخارجية أولًا، يستطيع .xs الوصول مباشرةً إلى أي مستوى باستخدام اسمه. على سبيل المثال، يعيد df.xs(2022, level='year') جميع صفوف عام 2022 عبر جميع الدول، دون الحاجة إلى تحديد 'USA' أو 'UK' أو 'DE'.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)
# All countries for year 2022 (inner level)
print('All data for year 2022:')
print(df.xs(2022, level='year'))
# All years for UK (outer level)
print('\nAll years for UK:')
print(df.xs('UK', level='country'))الوصول إلى أعمدة MultiIndex
عندما يحتوي DataFrame على MultiIndex للأعمدة، استخدم الصفوف للوصول إلى أعمدة محددة: df[('revenue', 'Q1')]. لتحديد جميع الأعمدة في مستوى خارجي (مثل جميع أعمدة الإيرادات)، استخدم df['revenue']، الذي يعيد DataFrame يضم جميع أعمدة المستوى الداخلي التابعة لذلك المفتاح الخارجي. يعمل نمط pd.IndexSlice أيضًا مع MultiIndex الأعمدة عند دمجه مع .loc.
import pandas as pd
import numpy as np
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
cols = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
df = pd.DataFrame(
np.random.randint(50, 200, (3, 8)),
columns=cols,
index=['USA', 'UK', 'DE']
)
# Access all revenue columns
print('Revenue columns:')
print(df['revenue'])
# Access a specific cell
print('\nUSA revenue Q1:', df.loc['USA', ('revenue', 'Q1')])تحديد المستوى الداخلي عبر جميع المفاتيح الخارجية
لتحديد قيمة واحدة من المستوى الداخلي عبر جميع قيم المستوى الخارجي، ادمج .loc مع slice(None) للمستوى الخارجي: df.loc[(slice(None), 2022), :]. يحدد ذلك صف عام 2022 لكل دولة. وتكون صيغة pd.IndexSlice أكثر وضوحًا: df.loc[idx[:, 2022], :]. غالبًا ما تحتاج إلى هذا النمط عندما تريد الحصول على لقطة لجميع الكيانات عند نقطة زمنية محددة.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)
idx = pd.IndexSlice
# All countries for year 2022 (using IndexSlice)
all_2022 = df.loc[idx[:, 2022], :]
print('All countries in 2022:')
print(all_2022)الأخطاء الشائعة عند التحديد باستخدام MultiIndex
هناك ثلاثة أخطاء شائعة: 1) فهرس غير مرتب: يؤدي تقطيع MultiIndex غير المرتب إلى رفع UnsortedIndexError أو إرجاع نتائج خاطئة — استدعِ sort_index() دائمًا أولًا. 2) KeyError عند استخدام صف كمفتاح: إذا مرّرت صفًا دون تغليفه داخل .loc[]، فسيفسره Python على أنه فهرسة موضعية — استخدم .loc دائمًا للوصول القائم على التسميات في MultiIndex. 3) عدم تطابق المستوى: بعد استخدام groupby، قد لا تتطابق أسماء مستويات MultiIndex مع ما تتوقعه — تحقّق من df.index.names قبل إجراء التقطيع.
import pandas as pd
# Unsorted MultiIndex slicing
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)
# Sort before slicing
df = df.sort_index()
print('After sort:', df.index.is_monotonic_increasing)
idx = pd.IndexSlice
print('\nSlice A:')
print(df.loc[idx['A', :], :])مثال عملي: إعداد التقارير ربع السنوية
حالة استخدام عملية: لديك بيانات مبيعات مفهرسة حسب (المنطقة، الربع) وتحتاج إلى استخراج الربع الرابع عبر جميع المناطق لإعداد تقرير نهاية العام. استخدم .xs('Q4', level='quarter') للحصول على هذا المقطع العرضي باستدعاء واحد. ثم احسب الإجمالي باستخدام .sum(). هذا النمط — تجميع groupby → نتيجة MultiIndex → استخراج مقطع عرضي — شائع جدًا في مسارات إعداد تقارير الأعمال.
import pandas as pd
import numpy as np
regions = ['North', 'South', 'East', 'West']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mi = pd.MultiIndex.from_product([regions, quarters], names=['region', 'quarter'])
np.random.seed(42)
df = pd.DataFrame({
'sales': np.random.randint(200, 500, 16),
'units': np.random.randint(50, 150, 16)
}, index=mi)
# Extract Q4 performance across all regions
q4 = df.xs('Q4', level='quarter')
print('Q4 Results by Region:')
print(q4)
print('\nQ4 Total Sales:', q4['sales'].sum())دمج تحديد MultiIndex مع الأعمدة
يمكنك تحديد صفوف وأعمدة معيّنة في الوقت نفسه باستخدام .loc[row_indexer, column_list]. عند استخدام MultiIndex، يكون محدد الصفوف صفًا أو قائمة من الصفوف أو IndexSlice، بينما يكون محدد الأعمدة اسم عمود أو قائمة من الأسماء. يتيح لك ذلك استخراج جدول فرعي مستطيل دقيق من DataFrame هرمي في تعبير واحد.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({
'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000],
'inflation': [1.5, 2.1, 2.8, 2.0, 3.4, 2.9, 3.2, 5.1, 4.8],
'unemployment': [5.0, 4.8, 4.5, 4.5, 4.2, 4.0, 3.8, 3.5, 3.3]
}, index=mi)
idx = pd.IndexSlice
# UK and USA, years 2022-2023, only gdp and inflation
result = df.loc[idx['UK':'USA', 2022:2023], ['gdp', 'inflation']]
print(result)تحقق سريع
اختبر مدى فهمك لتحديد البيانات باستخدام MultiIndex مما ورد في هذا الدرس.
مراجعة الدرس
تعلّمت في هذا الدرس استخدام .loc مع الصفوف لتحديد مجموعات تسميات (الخارجية، الداخلية) معيّنة، واستخدام pd.IndexSlice لتقطيع النطاقات عبر أي مستويات، واستخدام .xs() لاستخراج مقطع عرضي عند أي مستوى بغض النظر عن المفاتيح الخارجية. رتّب الفهرس دائمًا أولًا لتجنب UnsortedIndexError. بعد ذلك سنستكشف محاذاة الفهارس وإعادة الفهرسة — وكيف يحاذي Pandas اثنين من DataFrame إلى فهرس مشترك.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «تحديد البيانات من MultiIndex» مجاني؟
نعم — نص درس «تحديد البيانات من MultiIndex» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحديد البيانات من MultiIndex»؟
استرجع البيانات من مستويات الفهرس الخارجية والداخلية باستخدام .loc مع الصفوف الجزئية والشرائح ومساعد pd.IndexSlice. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تحديد البيانات من MultiIndex»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء MultiIndex
- تحديد البيانات من MultiIndex
- محاذاة الفهارس وإعادة فهرستها
- فوائد الأداء للفهرس المرتب