Pandas & NumPy Academy · درس

تعيين الفهرس وإعادة تعيينه

حوّل عمودًا إلى فهرس الصفوف باستخدام set_index()، وأعده إلى عمود باستخدام reset_index()، وتعرّف على MultiIndex.

الدرس 4 من 413 خطوة

تعيين الفهرس وإعادة تعيينه درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

ما هو فهرس DataFrame؟

يحتوي كل DataFrame في Pandas على فهرس للصفوف — وهو مجموعة من التسميات المرتبطة بكل صف. والفهرس الافتراضي هو RangeIndex (0، 1، 2، …)، لكن يمكنكم استبداله بأي عمود يعمل كمعرّف طبيعي: تاريخ، أو معرّف منتج، أو معرّف مستخدم، أو أي مفتاح فريد. ويحسن الفهرس ذو المعنى قابلية القراءة، ويتيح التقطيع المستند إلى التسميات، ويُعد مطلوبًا لإعادة أخذ عينات السلاسل الزمنية.

import pandas as pd

df = pd.DataFrame({
    'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
    'sales': [100, 200, 150]
})
print('Default index:', df.index.tolist())  # [0, 1, 2]
print(df)

set_index() — ترقية عمود

ترقّي DataFrame.set_index('col') العمود المحدد ليصبح فهرس الصفوف، وتزيله من الأعمدة العادية. وتصبح قيم العمود تسميات للصفوف. وهذه هي الطريقة المعتادة لجعل DataFrame أكثر تعبيرًا عندما يعمل أحد الأعمدة كمفتاح طبيعي. ويُرجع DataFrame جديدًا؛ ولا يتغير الأصل إلا عند استخدام inplace=True.

import pandas as pd

df = pd.DataFrame({
    'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
    'sales': [100, 200, 150]
})

df = df.set_index('date')
print(df)
#             sales
# date
# 2024-01-01    100
# 2024-01-02    200
# 2024-01-03    150

print(df.index)  # Index(['2024-01-01', ...], dtype='object', name='date')

تحديد الصفوف باستخدام فهرس مخصص

بعد جعل عمود ذي معنى فهرسًا، يمكنكم استخدام .loc[label] لاسترجاع الصفوف حسب التسمية بصياغة واضحة وسهلة القراءة — من دون الحاجة إلى أقنعة منطقية. وبالنسبة إلى DatetimeIndex، يمكنكم حتى استخدام سلاسل تواريخ جزئية مثل df.loc['2024-01'] لتحديد جميع الصفوف في يناير 2024.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C'],
    'price': [10, 20, 30],
    'stock': [100, 50, 75]
})
df = df.set_index('product')

# Access row by label
print(df.loc['B'])
# price    20
# stock    50
# Name: B, dtype: int64

set_index() مع عدة أعمدة — MultiIndex

يؤدي تمرير قائمة من أسماء الأعمدة إلى set_index() إلى إنشاء MultiIndex (فهرس هرمي). ويمكن الوصول إلى DataFrame الناتج باستخدام tuples في .loc[]. ويُعد MultiIndex ضروريًا للسلاسل الزمنية المجمعة (المنطقة + التاريخ)، والبيانات اللوحية (الموضوع + الوقت)، وأي تحليل يتطلب تجميع الصفوف على مستويين.

import pandas as pd

df = pd.DataFrame({
    'region': ['East', 'East', 'West', 'West'],
    'year': [2023, 2024, 2023, 2024],
    'revenue': [100, 150, 200, 220]
})

df = df.set_index(['region', 'year'])
print(df)
#              revenue
# region year
# East   2023      100
#        2024      150
# West   2023      200
#        2024      220

print(df.loc[('East', 2024)])  # revenue = 150

المعلمة drop= في set_index()

تزيل set_index('col') افتراضيًا العمود من الأعمدة العادية في DataFrame بعد أن يصبح فهرسًا. مرّروا drop=False من أجل الإبقاء على العمود في مكانه مع استخدامه أيضًا فهرسًا. وقد يكون ذلك مفيدًا عندما تريدون الوصول المستند إلى التسمية، وتحتاجون في الوقت نفسه إلى توفر العمود لإجراء الحسابات ضمن مساحة الأعمدة العادية.

import pandas as pd

df = pd.DataFrame({'id': [1, 2, 3], 'value': [10, 20, 30]})

# Keep 'id' as both index and column
df_with_both = df.set_index('id', drop=False)
print(df_with_both)
#     id  value
# id
# 1    1     10
# 2    2     20
# 3    3     30

reset_index() — إعادة الفهرس إلى عمود

تُعد reset_index() عكس set_index(): فهي تنقل فهرس الصفوف الحالي إلى عمود عادي، وتستبدل الفهرس بـ RangeIndex الافتراضي. ويُحتاج إليها عادةً بعد استخدام groupby().agg() أو بعد العمليات التي تترك فهرسًا ذا معنى وتحتاجون إلى استخدامه كعمود في المعالجة اللاحقة.

import pandas as pd

df = pd.DataFrame({'sales': [100, 200]}, index=['East', 'West'])
df.index.name = 'region'

reset = df.reset_index()
print(reset)
#   region  sales
# 0   East    100
# 1   West    200

print(reset.index.tolist())  # [0, 1] — default RangeIndex restored

reset_index(drop=True)

يؤدي تمرير drop=True إلى reset_index() إلى تجاهل الفهرس الحالي بالكامل بدلًا من نقله إلى عمود. استخدموا ذلك عندما لا يحمل الفهرس الحالي معلومات ذات معنى (مثلًا بعد تصفية الصفوف، إذ يحتوي الفهرس على فجوات مثل 0 و3 و7)، وتريدون فهرسًا تسلسليًا نظيفًا يبدأ من 0.

import pandas as pd

df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
filtered = df[df['x'] > 15]
print('Filtered index:', filtered.index.tolist())  # [1, 2, 3, 4]

# Drop the old index — don't move it to a column
clean = filtered.reset_index(drop=True)
print('Clean index:', clean.index.tolist())  # [0, 1, 2, 3]

reset_index() بعد groupby

بعد استدعاء groupby().agg()، تصبح مفاتيح التجميع هي الفهرس. ويحوّل استدعاء reset_index() هذه المفاتيح إلى أعمدة عادية، مما يعطي نتيجة جدولية مسطحة يسهل التعامل معها أو دمجها أو تصديرها. وهذا أحد أكثر الاستخدامات شيوعًا لـ reset_index() عمليًا.

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR'],
    'salary': [90000, 50000, 80000, 70000, 55000]
})

# After groupby, dept becomes the index
agg = df.groupby('dept')['salary'].mean()
print(type(agg), agg.index.tolist())
# dept is the index

# Reset makes dept a regular column again
result = agg.reset_index()
result.columns = ['dept', 'avg_salary']
print(result)

rename_axis() لاسم الفهرس

عندما لا يكون لفهرس الصفوف اسم، أو عندما تريدون إعادة تسميته لتوضيحه، استخدموا df.rename_axis('new_name') (لفهرس الصفوف) أو df.rename_axis('col_name', axis=1) (لمحور الأعمدة). ويجعل منح الفهرس اسمًا ذا معنى الناتج موضحًا لذاته بدرجة أكبر، خصوصًا عند تصديره إلى CSV، حيث يصبح اسم الفهرس عنوانًا لعمود.

import pandas as pd

df = pd.DataFrame({'sales': [100, 200, 300]}, index=['A', 'B', 'C'])
print(df.index.name)  # None

# Name the index
df = df.rename_axis('region')
print(df)
#         sales
# region
# A         100
# B         200
# C         300

إعادة الفهرسة لملء الفجوات

تعيد DataFrame.reindex(new_index) تشكيل DataFrame ليتطابق مع فهرس جديد، وتملأ المواضع الموجودة في الفهرس الجديد وغير الموجودة في البيانات الأصلية بـ NaN. ويُستخدم ذلك لمحاذاة DataFrame مع فهرس كامل مشترك — مثل ضمان ظهور كل شهر في السنة، حتى إذا لم تتوفر بيانات لبعض الأشهر.

import pandas as pd

df = pd.DataFrame({
    'month': ['Jan', 'Mar', 'Jun'],
    'revenue': [100, 200, 300]
}).set_index('month')

all_months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
complete = df.reindex(all_months)
print(complete)
#       revenue
# Jan     100.0
# Feb       NaN   <- filled with NaN
# Mar     200.0
# Apr       NaN
# May       NaN
# Jun     300.0

reset_index وتهيئة المستوى في MultiIndex

بالنسبة إلى DataFrame من نوع MultiIndex، تنقل reset_index() جميع المستويات إلى الأعمدة افتراضيًا. مرّروا level= لإعادة ضبط مستويات محددة فقط. ويفيد ذلك عندما تريدون الإبقاء على أحد المستويات فهرسًا (مثل الإبقاء على التاريخ فهرسًا) ونقل المستوى الآخر فقط إلى عمود.

import pandas as pd

df = pd.DataFrame(
    {'revenue': [100, 150, 200, 220]},
    index=pd.MultiIndex.from_tuples(
        [('East', 2023), ('East', 2024), ('West', 2023), ('West', 2024)],
        names=['region', 'year']
    )
)

# Reset only the 'year' level, keep 'region' as index
df2 = df.reset_index(level='year')
print(df2)
#         year  revenue
# region
# East    2023      100
# East    2024      150
# West    2023      200
# West    2024      220

تحقق سريع

اختبروا مدى فهمكم لتعيين الفهرس وإعادة ضبطه.

مراجعة الدرس

تعلمتم في هذا الدرس أن set_index('col') ترقّي عمودًا ليصبح فهرس الصفوف من أجل الوصول المستند إلى التسميات، وأن تمرير قائمة ينشئ MultiIndex، وأن reset_index() تنقل الفهرس إلى عمود (استخدموا drop=True لتجاهله بدلًا من ذلك). استخدموا reindex() للمحاذاة مع فهرس هدف كامل، مع ملء المواضع المفقودة بـ NaN. وتُعد هذه التقنيات أساسية للدروس القادمة حول GroupBy والدمج.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

الأسئلة الشائعة

هل درس «تعيين الفهرس وإعادة تعيينه» مجاني؟

نعم — نص درس «تعيين الفهرس وإعادة تعيينه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

ماذا ستتعلم في «تعيين الفهرس وإعادة تعيينه»؟

حوّل عمودًا إلى فهرس الصفوف باستخدام set_index()، وأعده إلى عمود باستخدام reset_index()، وتعرّف على MultiIndex. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟

لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تعيين الفهرس وإعادة تعيينه»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟

نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الفرز حسب قيم الأعمدة
  2. الفرز حسب الفهرس
  3. ترتيب القيم
  4. تعيين الفهرس وإعادة تعيينه
← العودة إلى Pandas & NumPy Academy