Pandas: نظام الفهرسة
آخر تحديث: 2026-08-26
مؤشر (Index) هو الميزة الأكثر تقليلًا من أهميتها وأكثرها قوة في مكتبة بانداز. إنه أكثر بكثير من مجرد "تسمية صف" —مؤشر هو الآلية الأساسية خلف محاذاة البيانات، حيث يعمل كـ "مفتاح" يطابق القيم تلقائيًا عند تفاعل السلاسل الزمنية وأطر البيانات في العمليات الحسابية. بمجرد فهمك لمؤشر، ستفهم لماذا بانداز أكثر ملاءمة لتحليل البيانات من مكتبة نامباي. يتعمق هذا القسم في طبيعة المؤشر وأنواعه وآليات المحاذاة.
ملاحظة: يجب تشغيل الكود أدناه في بيئة بايثون محلية.
1. ما ستتعلمه
- ❶ طبيعة الفهرس وتسلسله الهرمي
- ❷ عمليات set_index / reset_index
- ❸ محاذاة الفهرس (الميزة الأهم في Pandas)
- ❹ إعادة الفهرسة والمحاذاة
- ❺ خصائص وطرق الفهرس الشائعة
2. مشكلة محاذاة المبيعات لمدة شهرين لدي أليس
(1) نقطة الألم: صفوف غير محاذاة
محل القهوة الخاص بأليس له أيام تشغيل مختلفة في يناير وفبراير (31 يومًا في يناير، 28 في فبراير)، وفي بعض الأيام كان المحل مغلقًا. تحتاج إلى دمج ومقارنة بيانات الشهرين:
import pandas as pd
# مبيعات يناير (بعض الأيام مغلقة)
jan = pd.Series({'Mon': 320, 'Tue': 280, 'Wed': 350, 'Thu': 410, 'Fri': 390})
# مبيعات فبراير (أيام مختلفة، الاثنين/الثلاثاء مغلقان)
feb = pd.Series({'Wed': 370, 'Thu': 420, 'Fri': 400, 'Sat': 550, 'Sun': 510})
# نمط NumPy: سيقوم فقط بإضافة الموضع بالموضع — خطأ!
# Pandas: يُحاذِي تلقائيًا حسب تسمية الفهرس
total = jan + feb
print(total)
# Fri 790.0 ← تطابق!
# Mon NaN ← موجود فقط في يناير
# Sat NaN ← موجود فقط في فبراير
# Sun NaN ← موجود فقط في فبراير
# Thu 830.0 ← تطابق!
# Tue NaN ← موجود فقط في يناير
# Wed 720.0 ← تطابق!
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الخاص بك.
(2) الحل: المحاذاة التلقائية للفهرس
عندما تجري Pandas عملية حسابية، فإنها تُحاذِي تلقائيًا حسب تسمية الفهرس — القيم ذات التسميات المتطابقة تُجمع معًا، بينما تُملأ التسميات غير المتطابقة بـ NaN. لا تحتاج أبدًا إلى مطابقة صفوف البيانات يدويًا.
▶ مثال: عمليات المحاذاة و fill_value (الصعوبة ⭐⭐)
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الخاص بك.
import pandas as pd
jan = pd.Series({'Mon': 320, 'Tue': 280, 'Wed': 350, 'Thu': 410, 'Fri': 390})
feb = pd.Series({'Wed': 370, 'Thu': 420, 'Fri': 400, 'Sat': 550, 'Sun': 510})
# ملء القيم المفقودة بـ 0 لمقارنة أنظف
total = jan.add(feb, fill_value=0)
print(total.sort_index())
# Fri 790.0
# Mon 320.0 ← يناير فقط، فبراير=0
# Sat 550.0 ← فبراير فقط، يناير=0
# Sun 510.0 ← فبراير فقط، يناير=0
# Thu 830.0
# Tue 280.0 ← يناير فقط، فبراير=0
# Wed 720.0
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الخاص بك.
(3) الفائدة: محاذاة الفهرس تمنع الأخطاء الخفية
إذا استخدمت NumPy للإضافة حسب الموضع، فإن jan[0] + feb[0] سيعطي 320 + 370 = 690 — لكن يوم الاثنين والأربعاء ليسا نفس اليوم على الإطلاق! محاذاة الفهرس تُحررك من نهج "المطابقة الموضعية" المُعرَّض للأخطاء.
3. طبيعة وأنواع الفهرس
(1) الفهرس ليس مصفوفة عادية
الفهرس هو **كائن غير قابل للتعديل، يشبه الـ ndarray، مصمم خصيصًا للفهرسة والمحاذاة القائمة على التسميات. خصائصه الرئيسية:
- غير قابل للتعديل (Immutable): لا يمكن تعديله بعد الإنشاء (يضمن سلامة البيانات)
- قابل للتجزئة (Hashable): يمكن أن يكون بمثابة مفاتيح قاموس أو عناصر مجموعة
- يسمح بالتكرارات (Duplicates allowed): يسمح بالتسميات المتكررة (على الرغم من أن هذا يؤثر على الأداء)
- أنواع فرعية متعددة: RangeIndex / DatetimeIndex / CategoricalIndex، إلخ.
graph TB
IDX["الفهرس (أساسي)"] --> RI["RangeIndex<br/>مولّد تلقائيًا 0,1,2,..."]
IDX --> DI["DatetimeIndex<br/>تسميات قائمة على الوقت"]
IDX --> CI["CategoricalIndex<br/>مجموعة محدودة من الفئات"]
IDX --> MI["MultiIndex<br/>تسميات هرمية"]
IDX --> GI["فهرس عام<br/>تسميات اعتباطية"]
> **الخرج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas الخاص بك.
(2) مقارنة أنواع الفهارس
| النوع | كيفية الإنشاء | الاستخدام النموذجي | الميزات الخاصة |
|---|---|---|---|
| RangeIndex | افتراضي | عندما لا يتم تحديد فهرس | كفاءة في استخدام الذاكرة |
| Index | يُحدد يدويًا | تسميات نصية/عددية | للاستخدام العام |
| DatetimeIndex | pd.date_range | السلاسل الزمنية | تردد/إزاحة/إعادة تعيين |
| CategoricalIndex | dtype='category' | فئات محدودة | فئات مرتبة/غير مرتبة |
| MultiIndex | from_tuples/from_product | بيانات هرمية | اختيار متعدد المستويات |
▶ مثال: فحص نوع الفهرس (الصعوبة ⭐)
> **الخرج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas الخاص بك.
import pandas as pd
# RangeIndex (افتراضي)
s1 = pd.Series([1, 2, 3])
print(type(s1.index)) # <class 'pandas.core.indexes.range.RangeIndex'>
# فهرس عام (تسميات نصية)
s2 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
print(type(s2.index)) # <class 'pandas.core.indexes.base.Index'>
# DatetimeIndex
dates = pd.date_range('2026-01-01', periods=5)
s3 = pd.Series([100, 200, 150, 300, 250], index=dates)
print(type(s3.index)) # <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
> **الخرج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas الخاص بك.
4. set_index و reset_index
(1) set_index: تحويل عمود إلى تسميات الصفوف
▶ مثال: استخدام set_index (الصعوبة ⭐)
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا — قم بتثبيتها محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًّا حسب إصدار pandas لديك.
import pandas as pd
df = pd.DataFrame({
'product': ['Coffee', 'Tea', 'Juice'],
'price': [4.50, 3.80, 5.20],
'category': ['Hot', 'Hot', 'Cold']
})
# تعيين العمود product كفهرس
df_indexed = df.set_index('product')
print(df_indexed)
# price category
# product
# Coffee 4.50 Hot
# Tea 3.80 Hot
# Juice 5.20 Cold
print(df_indexed.loc['Coffee', 'price']) # 4.5
# حذف العمود بعد التعيين (الافتراضي=True)
# الاحتفاظ بالعمود: drop=False
df_keep = df.set_index('product', drop=False)
print(df_keep.columns) # لا يزال يحتوي على 'product'
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا — قم بتثبيتها محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًّا حسب إصدار pandas لديك.
(2) reset_index: استعادة تسميات الصفوف إلى عمود
▶ مثال: استخدام reset_index (الصعوبة ⭐)
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا — قم بتثبيتها محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًّا حسب إصدار pandas لديك.
import pandas as pd
df = pd.DataFrame({
'price': [4.50, 3.80, 5.20]
}, index=['Coffee', 'Tea', 'Juice'])
# إعادة تعيين الفهرس إلى عمود
df_reset = df.reset_index()
print(df_reset)
# index price
# 0 Coffee 4.50
# 1 Tea 3.80
# 2 Juice 5.20
# تسمية العمود الجديد
df_reset2 = df.reset_index(names='product')
print(df_reset2.columns) # Index(['product', 'price'])
# حذف الفهرس تمامًا (عدم الاحتفاظ به كعمود)
df_drop = df.reset_index(drop=True)
print(df_drop)
# price
# 0 4.50
# 1 3.80
# 2 5.20
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا — قم بتثبيتها محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًّا حسب إصدار pandas لديك.
(3) مقارنة بين set_index و reset_index
| العملية | set_index | reset_index |
|---|---|---|
| الاتجاه | عمود ← تسميات الصفوف | تسميات الصفوف ← عمود |
| العمود الأصلي | يُحذف افتراضيًّا (drop=True) | يُحتفظ به كعمود جديد |
| الفهرس الافتراضي | لا يوجد (يجب تحديد عمود) | RangeIndex (0,1,2,...) |
| التعديل في المكان | لا افتراضيًّا (inplace=False) | لا افتراضيًّا |
5. تعمّق في محاذاة الفهارس
(1) قواعد المحاذاة
عندما يتم دمج كائنتين من Pandas (سلسلة أو إطار بيانات) في عملية:
- يتم حساب اتحاد كلا الفهارس
- يتم تنفيذ العمليات على العناصر المتطابقة التسميات
- يتم ملء العناصر غير المتطابقة التسميات بقيمة NaN
graph LR
A["سلسلة A<br/>{a:1, b:2, c:3}"] --> ADD["A + B"]
B["سلسلة B<br/>{b:20, c:30, d:40}"] --> ADD
ADD --> R["النتيجة<br/>{a:NaN, b:22, c:33, d:NaN}"]
> **المخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تتغير القيم الفعلية قليلاً اعتمادًا على إصدار pandas الخاص بك.
▶ مثال: محاذاة إطار البيانات (الصعوبة ⭐⭐)
> **المخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تتغير القيم الفعلية قليلاً اعتمادًا على إصدار pandas الخاص بك.
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['x', 'y', 'z'])
df2 = pd.DataFrame({'A': [10, 20, 30]}, index=['y', 'z', 'w'])
result = df1 + df2
print(result)
# A
# w NaN
# x NaN
# y 22.0
# z 33.0
# مع fill_value
result2 = df1.add(df2, fill_value=0)
print(result2)
# A
# w 30.0
# x 1.0
# y 22.0
# z 33.0
> **المخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تتغير القيم الفعلية قليلاً اعتمادًا على إصدار pandas الخاص بك.
نصيحة: تحدث محاذاة الفهارس ليس فقط مع عوامل التشغيل +, -, *, / ولكن أيضًا مع طرق مثل add/sub/mul/div. ينطبق معامل
fill_valueفقط على الجانب الذي يفتقر إلى تسمية — إذا كان كلا الجانبين يفتقران إلى تسمية، فالنتيجة لا تزال NaN.
6. إعادة الفهرسة والمحاذاة
(1) إعادة الفهرسة: تغيير شكل الفهرس
▶ مثال: استخدام إعادة الفهرسة (الصعوبة ⭐⭐)
> **الإخراج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.
import pandas as pd
s = pd.Series([320, 280, 350], index=['Mon', 'Tue', 'Wed'])
# إعادة الفهرسة لتضمين تسميات جديدة (تعبئة بـ NaN)
s_full = s.reindex(['Mon', 'Tue', 'Wed', 'Thu', 'Fri'])
print(s_full)
# Mon 320.0
# Tue 280.0
# Wed 350.0
# Thu NaN
# Fri NaN
# تعبئة القيم المفقودة
s_filled = s.reindex(['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], fill_value=0)
print(s_filled)
# التعبئة للأمام (استخدام القيمة السابقة)
s_ffill = s.reindex(['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], method='ffill')
print(s_ffill)
# Thu يأخذ قيمة Wed (350)
> **الإخراج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.
(2) المحاذاة: محاذاة متسلسلتين معاً
▶ مثال: طريقة المحاذاة (الصعوبة ⭐⭐)
> **الإخراج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.
import pandas as pd
s1 = pd.Series({'a': 1, 'b': 2, 'c': 3})
s2 = pd.Series({'b': 20, 'c': 30, 'd': 40})
# محاذاة كلاهما إلى الفهرس الموحد
s1_aligned, s2_aligned = s1.align(s2)
print(s1_aligned)
# a 1.0
# b 2.0
# c 3.0
# d NaN
print(s2_aligned)
# a NaN
# b 20.0
# c 30.0
# d 40.0
# المحاذاة مع قيمة التعبئة
s1_f, s2_f = s1.align(s2, fill_value=0)
print(s1_f)
# a 1
# b 2
# c 3
# d 0
> **الإخراج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.
(3) مقارنة إعادة الفهرسة والمحاذاة
| الطريقة | الغرض | حالة الاستخدام |
|---|---|---|
| reindex | تغيير شكل كائن واحد إلى فهرس جديد | توسيع الفهرس أو إعادة ترتيبه |
| align | محاذاة كائنين في وقت واحد | مطابقة كائنين لبعضهما البعض |
7. الخصائص والطرق الشائعة للمؤشر
(1) المرجع السريع
| الخاصية/الوصف | الطريقة | نتيجة المثال |
|---|---|---|
idx.is_unique |
هل جميع العلامات فريدة | True / False |
idx.is_monotonic_increasing |
هل العلامات تزداد بشكل أحادي الاتجاه | True / False |
idx.has_duplicates |
هل يوجد تكرارات | True / False |
idx.nunique() |
عدد القيم الفريدة | 7 |
idx.duplicated() |
قناع منطقي للتكرارات | مصفوفة منطقية |
idx.drop_duplicates() |
إزالة التكرارات | مؤشر جديد |
▶ مثال: فحص خصائص المؤشر (الصعوبة ⭐)
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
import pandas as pd
idx1 = pd.Index(['a', 'b', 'c', 'd'])
idx2 = pd.Index(['a', 'b', 'b', 'c'])
print(idx1.is_unique) # True
print(idx2.is_unique) # False
print(idx2.has_duplicates) # True
print(idx1.nunique()) # 4
print(idx2.duplicated()) # [False, False, True, False]
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
8. مثال كامل: محاذاة وتنظيم بيانات المبيعات الشهرية
▶ مثال: سير عمل محاذاة المبيعات لمدة شهرين (الصعوبة ⭐⭐⭐)
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبّتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًّا حسب إصدار pandas لديك.
import pandas as pd
import numpy as np
# ============================================
# مثال شامل: محاذاة وتنظيم بيانات المبيعات
# الشهرية باستخدام الفهرس (Index)
# ============================================
# 1. مبيعات يومية لمدة شهرين (أيام مختلفة)
jan = pd.Series({
'2026-01-06': 320, '2026-01-07': 280, '2026-01-08': 350,
'2026-01-09': 410, '2026-01-10': 390
}, name='jan_sales')
feb = pd.Series({
'2026-02-04': 370, '2026-02-05': 420, '2026-02-06': 400,
'2026-02-07': 550
}, name='feb_sales')
# 2. معلومات الفهرس
print("=== تحليل الفهرس ===")
print(f"يناير فريد: {jan.index.is_unique}") # True
print(f"فبراير فريد: {feb.index.is_unique}") # True
# 3. محاذاة كلا الشهرين إلى تنسيق مشترك
jan_a, feb_a = jan.align(feb, fill_value=0)
print(f"\n=== البيانات بعد المحاذاة ===")
comparison = pd.DataFrame({'jan': jan_a, 'feb': feb_a})
print(comparison)
# 4. تعيين الفهرس على DataFrame للوصول القائم على التسمية
df = pd.DataFrame({
'product': ['Latte', 'Cappuccino', 'Espresso', 'Mocha', 'Americano'],
'price': [5.50, 4.80, 3.50, 5.20, 3.00],
'category': ['Specialty', 'Specialty', 'Classic', 'Specialty', 'Classic']
})
print(f"\n=== المنتجات حسب الفئة ===")
df_cat = df.set_index('category')
print(df_cat.loc['Specialty', ['product', 'price']])
# 5. إعادة الفهرسة لضمان وجود جميع أيام الأسبوع
weekday_sales = pd.Series(
[320, 280, 350, 410, 390],
index=['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
)
full_week = weekday_sales.reindex(
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
fill_value=0
)
print(f"\n=== مبيعات الأسبوع كامل ===")
print(full_week)
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبّتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًّا حسب إصدار pandas لديك.
❓ أسئلة شائعة
s.index.is_unique للتحقق من التفرد. من أفضل الممارسات الحفاظ على تفرد الفهرس كلما أمكن ذلك.drop=True العمود من DataFrame ويحوّله إلى الفهرس. إذا كنت بحاجة إلى الاحتفاظ بالعمود، استخدم df.set_index('col', drop=False). يمكن دائمًا استعادة معلومات الفهرس إلى عمود عبر reset_index.df.index = new_index، أو إعادة تسمية التسميات عبر df.rename(index=...). لا يمكنك تخصيص عناصر فردية من الفهرس.drop=True، يتم تجاهل الفهرس الأصلي (لا يحتفظ به كعمود)، مما يمنحك RangeIndex نظيفًا. باستخدام drop=False (الافتراضي)، يتم استعادة الفهرس الأصلي كعمود عادي. حالة استخدام شائعة: بعد groupby، اتصل بـ reset_index(drop=True) لمسح مفاتيح التجميع.📖 ملخص
- الفهرس (Index) هو الآلية الأساسية لمحاذاة البيانات في Pandas — حيث تتم العمليات تلقائياً عبر المطابقة حسب التسميات
- الفهرس غير قابل للتعديل، وقابل للتجزئة، ويسمح بالتكرار؛ وله 5 أنواع فرعية (Range/Datetime/Categorical/Multi/General)
- set_index يقوم بتحويل عمود إلى تسميات صفوف؛ و reset_index يقوم باستعادة تسميات الصفوف إلى عمود
- قاعدة المحاذاة: حساب اتحاد الفهرس، والعمليات على التسميات المتطابقة، وملء التسميات غير المتطابقة بـ NaN
- reindex يقوم بإعادة تشكيل فهرس كائن واحد؛ بينما align يقوم بمحاذاة كائنين في وقت واحد
- الخصائص الشائعة: is_unique / has_duplicates / nunique() / duplicated()
- استخدم parameter fill_value لتجنب قيم NaN غير الضرورية أثناء العمليات الحسابية ➡️
📝 تمارين
- أساسي (مستع الصعوبة ⭐): أنشئ Series تحتوي على بيانات السكان لـ 5 مدن. استخدم set_index و reset_index على DataFrame للتحويل بين الأعمدة والفهرس، وراقب كيف يتغير الفهرس.
- متوسط (مستع الصعوبة ⭐⭐): أنشئ Seriesين بفهارس متداخلة جزئيًا. أضفهما باستخدام كلًا من عامل
+والدالةadd(fill_value=0)، ثم قارن الفروقات. بعد ذلك، استخدم الدالة align لمحاذاة السلسلتين. - تحدي (مستع الصعوبة ⭐⭐⭐): استخدم DatetimeIndex لإنشاء بيانات مبيعات لشهرين (يناير وفبراير، مع تواريخ مختلفة). استخدم reindex لملء جميع التواريخ لكلي الشهرين (املأ القيم المفقودة بالـ 0)، ثم احسب معدل النمو اليومي بين الشهرَين.