0Pricing
Pandas & NumPy Academy · درس

ترتيب القيم

عيّن رتبًا لقيم الأعمدة باستخدام rank()، واختر أساليب كسر التعادل، وأنشئ فئات مئينية باستخدام pd.cut().

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

ما هو الترتيب؟

يُسنِد الترتيب إلى كل قيمة في Series موضعًا يستند إلى مقدارها النسبي — فالرتبة 1 تكون لأصغر قيمة، والرتبة n لأكبر قيمة (أو العكس). وبخلاف الفرز الذي يعيد ترتيب الصفوف، تضيف rank() عمودًا جديدًا من المواضع الترتيبية إلى جانب البيانات الأصلية. تُستخدم الترتيبات في لوحات المتصدرين، وحساب المئينات، وبعض الاختبارات الإحصائية التي تتطلب الموضع الترتيبي بدلًا من القيم المطلقة.

import pandas as pd

df = pd.DataFrame({
    'player': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
    'score': [88, 72, 95, 72, 85]
})

df['rank'] = df['score'].rank()
print(df)
#    player  score  rank
# 0   Alice     88   4.0
# 1     Bob     72   1.5   <- tied with Dave
# 2   Carol     95   5.0
# 3    Dave     72   1.5   <- tied with Bob
# 4     Eve     85   3.0

الترتيب التصاعدي مقابل التنازلي

تُسنِد rank() افتراضيًا الرتبة 1 إلى أصغر قيمة (ترتيب تصاعدي). ولإسناد الرتبة 1 إلى أكبر قيمة (مثل المركز الأول في مسابقة)، مرّروا ascending=False. وهذا يطابق convention «المركز الأول = أعلى نتيجة» المستخدمة في الرياضة ولوحات المتصدرين وترتيبات المبيعات.

import pandas as pd

df = pd.DataFrame({'score': [70, 95, 85, 60, 90]})

# Rank 1 = highest score
df['competition_rank'] = df['score'].rank(ascending=False)
print(df)
#    score  competition_rank
# 0     70               4.0
# 1     95               1.0
# 2     85               3.0
# 3     60               5.0
# 4     90               2.0

طرق كسر التعادل

عندما تحتوي عدة صفوف على القيمة نفسها (أي عند حدوث تعادل)، تحدد المعلمة method كيفية إسناد الرتب. الخيارات هي: 'average' (الافتراضي — تتشارك الصفوف المتعادلة متوسط الرتب)، و'min' (تحصل جميع الصفوف المتعادلة على أدنى رتبة)، و'max' (تحصل جميعها على أعلى رتبة)، و'first' (يحصل الصف الظاهر أولًا على الرتبة الأدنى)، و'dense' (لا توجد فجوات في أرقام الرتب بعد التعادل).

import pandas as pd

s = pd.Series([10, 20, 20, 30])

print('average:', s.rank(method='average').tolist())  # [1.0, 2.5, 2.5, 4.0]
print('min:    ', s.rank(method='min').tolist())      # [1.0, 2.0, 2.0, 4.0]
print('max:    ', s.rank(method='max').tolist())      # [1.0, 3.0, 3.0, 4.0]
print('first:  ', s.rank(method='first').tolist())    # [1.0, 2.0, 3.0, 4.0]
print('dense:  ', s.rank(method='dense').tolist())    # [1.0, 2.0, 2.0, 3.0]

الترتيب الكثيف: بلا فجوات بعد التعادل

تكون طريقة 'dense' مفيدة خصوصًا عندما تريدون ترتيبًا بلا فجوات. باستخدام 'min'، يؤدي تعادل عنصرين في المركز الثاني إلى جعل الرتبة التالية هي 4 (مع تخطي 3). أما باستخدام 'dense'، فتكون الرتبة التالية دائمًا 3، وبذلك يتسلسل الترتيب دون انقطاع. ويُعد الترتيب الكثيف هو المعيار في دالة النافذة DENSE_RANK() في SQL، ويُستخدم شائعًا في لوحات المتصدرين.

import pandas as pd

df = pd.DataFrame({
    'name': ['A', 'B', 'C', 'D', 'E'],
    'score': [100, 80, 80, 60, 60]
})

df['dense_rank'] = df['score'].rank(method='dense', ascending=False).astype(int)
print(df)
#   name  score  dense_rank
# 0    A    100           1
# 1    B     80           2
# 2    C     80           2  <- same score, same rank
# 3    D     60           3  <- next rank is 3, not 4
# 4    E     60           3

ترتيب المئينات باستخدام pct=True

يؤدي ضبط pct=True في rank() إلى تطبيع الرتب ضمن النطاق [0، 1]، مما يمنحكم ترتيب المئين. وتعني قيمة ترتيب مئين تساوي 0.8 أن القيمة أعلى من 80% من القيم في العمود. ويُستخدم ذلك في التمويل (أداء المئينات)، ووضع الدرجات (مئينات النتائج)، واكتشاف القيم الشاذة.

import pandas as pd

df = pd.DataFrame({'score': [50, 70, 80, 90, 100]})

df['percentile'] = df['score'].rank(pct=True)
print(df)
#    score  percentile
# 0     50         0.2
# 1     70         0.4
# 2     80         0.6
# 3     90         0.8
# 4    100         1.0

الترتيب داخل المجموعات

لحساب الرتب داخل كل مجموعة بصورة مستقلة (مثل ترتيب رواتب كل قسم)، ادمجوا groupby() مع rank(). استخدموا groupby().rank()، التي تطبق دالة الترتيب على كل مجموعة وتُرجع Series متوافقة مع فهرس DataFrame الأصلي — وهو ما يناسب تمامًا إضافة عمود «الترتيب داخل المجموعة».

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'Eng', 'HR', 'HR', 'Eng'],
    'name': ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'],
    'salary': [90000, 70000, 55000, 65000, 80000]
})

df['dept_rank'] = df.groupby('dept')['salary'].rank(
    method='dense', ascending=False
).astype(int)
print(df.sort_values(['dept', 'dept_rank']))
#    dept   name  salary  dept_rank
# 0   Eng  Alice   90000          1
# 4   Eng    Eve   80000          2
# 1   Eng    Bob   70000          3
# 3    HR   Dave   65000          1
# 2    HR  Carol   55000          2

pd.cut() للفئات متساوية العرض

تقسم pd.cut(series, bins) عمودًا رقميًا مستمرًا إلى فواصل متساوية العرض (فئات)، وتُسنِد كل قيمة إلى فئتها. ويحوّل ذلك متغيرًا مستمرًا إلى متغير فئوي، وهو مفيد للمخططات التكرارية، ومجموعات الأعمار، وشرائح الدخل، وأي مهمة تتطلب التقطيع إلى فئات. والنتيجة هي Series من النوع Categorical تحمل تسميات الفواصل.

import pandas as pd

df = pd.DataFrame({'age': [5, 15, 25, 35, 45, 55, 65, 75]})

df['age_group'] = pd.cut(df['age'], bins=[0, 18, 35, 60, 100],
                          labels=['Child', 'Young Adult', 'Middle Age', 'Senior'])
print(df)
#    age    age_group
# 0    5        Child
# 1   15        Child
# 2   25  Young Adult
# 3   35  Young Adult
# 4   45   Middle Age
# 5   55   Middle Age
# 6   65       Senior
# 7   75       Senior

pd.qcut() للفئات متساوية التكرار

تقسم pd.qcut(series, q) القيم إلى فئات مبنية على الكميات، بحيث تحتوي كل فئة على عدد متقارب من المشاهدات. وبخلاف pd.cut() (متساوي العرض)، تنتج pd.qcut() مجموعات متساوية الحجم — وهو ما يفيد في التقسيم المستند إلى المئينات، مثل درجات الأعشار، أو تقسيم الأخماس، أو مجموعات الأرباع.

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({'score': np.random.randint(40, 100, 20)})

# Split into 4 equal-frequency quartiles
df['quartile'] = pd.qcut(df['score'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
print(df['quartile'].value_counts().sort_index())
# Q1    5
# Q2    5
# Q3    5
# Q4    5

cut() مقابل qcut() — الفروق الأساسية

استخدموا pd.cut() عندما تكون للفئات دلالة طبيعية في المجال (مثل شرائح الأعمار 0-18 و18-35 و35-60)، إذ تكون عروض الفئات مهمة من ناحية المعنى. واستخدموا pd.qcut() عندما تريدون أحجام مجموعات متساوية بغض النظر عن مواضع الحدود — مثل تقسيم العملاء إلى الربع الأعلى والربع الأدنى. سينتج التوزيع المنحاز مجموعات متفاوتة جدًا باستخدام cut()، لكنه سينتج مجموعات متساوية باستخدام qcut().

import pandas as pd
import numpy as np

np.random.seed(0)
# Skewed distribution: most values near 0
skewed = pd.Series(np.random.exponential(scale=5, size=100).round())

# cut with equal width: many empty or tiny upper bins
cut_counts = pd.cut(skewed, bins=4).value_counts().sort_index()
print('cut():', cut_counts.values)

# qcut with equal frequency: always 25 per group
qcut_counts = pd.qcut(skewed, q=4).value_counts().sort_index()
print('qcut():', qcut_counts.values)

إضافة رقم الترتيب كعمود

من الأنماط الواضحة لإنتاج جدول نتائج مرتب: الفرز ترتيبًا تنازليًا، وإعادة ضبط الفهرس ليبدأ من 0، ثم إضافة 1 للحصول على ترتيب يبدأ من 1 ومناسب للعرض، وعرضه إلى جانب البيانات الأصلية. وينتج عن ذلك جدول متصدرين جاهز للعرض، بلا فجوات وبأرقام ترتيب واضحة.

import pandas as pd

df = pd.DataFrame({
    'team': ['Falcons', 'Eagles', 'Hawks', 'Owls'],
    'wins': [12, 9, 12, 7]
})

leaderboard = (
    df
    .sort_values('wins', ascending=False)
    .reset_index(drop=True)
)
leaderboard.index = leaderboard.index + 1
leaderboard.index.name = 'place'
print(leaderboard)

الترتيب كميزة لتعلّم الآلة

تُعد الميزات المحوّلة إلى رتب مفيدة في تعلّم الآلة لأنها مقاومة للقيم الشاذة — فالقيمة الكبيرة جدًا أو الصغيرة جدًا تحصل على رتبة قريبة من أحد الطرفين بدلًا من تشويه توزيع الميزة. وتُستخدم أحيانًا عملية تحويل القيم إلى رتب كخطوة للمعالجة المسبقة قبل النماذج القائمة على الأشجار، أو عندما لا يكون المقياس الرقمي ذا معنى بينما يكون الترتيب النسبي مهمًا.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'income': [30000, 50000, 70000, 1_000_000]  # outlier at 1M
})

# Add rank as a feature
df['income_rank'] = df['income'].rank(pct=True)
print(df)
#      income  income_rank
# 0    30000         0.25
# 1    50000         0.50
# 2    70000         0.75
# 3  1000000         1.00
# The outlier has rank 1.0 — extreme but not disproportionate

تحقق سريع

اختبروا مدى فهمكم لترتيب القيم في Pandas.

مراجعة الدرس

تعلمتم في هذا الدرس أن rank() تُسنِد مواضع ترتيبية إلى القيم، وأن method='dense' تمنع الفجوات بعد حالات التعادل، وأن pct=True تمنح ترتيبات مئينية ضمن [0،1]، وأن groupby().rank() تحسب الرتب داخل المجموعات. استخدموا pd.cut() للفئات متساوية العرض، وpd.qcut() للفئات متساوية التكرار عند تحويل المتغيرات المستمرة إلى فئات. سننتقل بعد ذلك إلى تعيين فهرس DataFrame وإعادة ضبطه.

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

هل درس «ترتيب القيم» مجاني؟

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

ماذا ستتعلم في «ترتيب القيم»؟

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

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

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

كم من الوقت يستغرق درس «ترتيب القيم»؟

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

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

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

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

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