الفرق بين loc و iloc في pandas واختيار الصفوف والأعمدة

الفرق بين loc و iloc في pandas واختيار الصفوف والأعمدة للمبتدئين

الفرق بين loc وiloc في pandas هو أن loc تختار البيانات حسب Labels الصفوف والأعمدة، بينما iloc تختارها حسب المواقع الرقمية التي تبدأ من الصفر. وقد تكون الـLabels نصوصًا أو أرقامًا؛ لذلك loc[0] تعني الصف الذي يحمل label يساوي 0، وليس بالضرورة أول صف، بينما iloc[0] تعني أول صف بالموقع.

إذا كان هدفك اختيار صفوف وأعمدة محددة، فاستخدم loc عندما تعرف أسماءها أو Labels الخاصة بها، وiloc عندما تعرف ترتيبها. ولتصفية DataFrame بشرط، يمكنك استخدام Boolean indexing مثل df[df["score"] >= 80]، أو دمج الشرط مع loc لاختيار الصفوف والأعمدة المطلوبة في سطر واحد.

سنطبق ذلك على جدول صغير بعد مراجعة فهم DataFrame في pandas وقراءة CSV باستخدام pandas، ثم نغطي slicing والشروط المتعددة وisin() وstr.contains() والأخطاء الشائعة.

{alertInfo} القاعدة السريعة: loc للـLabels، وiloc للمواقع الرقمية، وBoolean filtering للاحتفاظ بالصفوف التي تحقق شرطًا.

{getToc} $title={محتوى المقال}

الفرق بين loc و iloc في pandas باختصار

النقطة loc iloc
أساس الاختيار Labels الصفوف والأعمدة، وقد تكون نصوصًا أو أرقامًا المواقع الرقمية من 0 إلى طول المحور ناقص 1
اختيار صف df.loc["row_label"] df.iloc[0]
اختيار عمود df.loc[:, "name"] df.iloc[:, 0]
نهاية slicing مشمولة عندما تكون الـLabels موجودة غير مشمولة مثل slicing العادي في بايثون
التصفية المنطقية تعمل مباشرة مع Boolean Series أو array، وهي مناسبة جدًا لتصفية الصفوف تدعم Boolean array، لكن Boolean Series لا تُمرر إليها مباشرة بالطريقة نفسها

أكثر نقطة تسبب الالتباس هي أن الأرقام داخل loc قد تكون Labels حقيقية، وليست مواقع. لهذا سنستخدم لاحقًا index مخصصًا لنرى الفرق بوضوح.

تجهيز DataFrame للتطبيق

سنستخدم نفس فكرة بيانات الطلاب حتى تكون الأمثلة سهلة القراءة. أنشئ ملف بايثون جديدًا واكتب:

import pandas as pd

data = {
    "name": ["Ali", "Sara", "Omar", "Mona", "Khaled"],
    "age": [22, 25, 20, 23, 24],
    "city": ["Aden", "Sanaa", "Taiz", "Aden", "Hadramout"],
    "score": [88, 91, 76, 95, 82]
}

df = pd.DataFrame(data)

print(df)

الناتج:

     name  age       city  score
0     Ali   22       Aden     88
1    Sara   25      Sanaa     91
2    Omar   20       Taiz     76
3    Mona   23       Aden     95
4  Khaled   24  Hadramout     82

لدينا خمسة صفوف وأربعة أعمدة. الـ index الافتراضي يبدأ من 0 وينتهي عند 4.

اختيار عمود واحد بالطريقة المباشرة

قبل loc وiloc، يجب أن تعرف الطريقة الأبسط لاختيار عمود باستخدام اسمه:

print(df["name"])

الناتج:

0       Ali
1      Sara
2      Omar
3      Mona
4    Khaled
Name: name, dtype: object

عندما تستخدم زوجًا واحدًا من الأقواس المربعة مع اسم عمود، تكون النتيجة غالبًا كائنًا من نوع Series.

اختيار أكثر من عمود

selected = df[["name", "score"]]

print(selected)

الناتج:

     name  score
0     Ali     88
1    Sara     91
2    Omar     76
3    Mona     95
4  Khaled     82

ما هي loc في pandas؟

loc هي أداة اختيار تعتمد على Labels الخاصة بالـindex والأعمدة. والـLabel قد يكون نصًا مثل "Ali" أو رقمًا مثل 100؛ المهم أنه اسم/قيمة الفهرس وليس موقع الصف.

df.loc[rows, columns]

إذا أردنا قيمة الاسم في الصف ذي الـ index رقم 1:

print(df.loc[1, "name"])

الناتج:

Sara
شرح loc لاختيار الصفوف والأعمدة باستخدام Labels في pandas

اختيار صف كامل باستخدام loc

print(df.loc[2])

الناتج:

name     Omar
age        20
city     Taiz
score      76
Name: 2, dtype: object

اختيار عدة صفوف وأعمدة باستخدام loc

result = df.loc[
    [0, 3],
    ["name", "score"]
]

print(result)

الناتج:

   name  score
0   Ali     88
3  Mona     95

استخدام slicing مع loc

print(df.loc[1:3])

مع loc تكون النهاية مشمولة عادةً، لذلك يظهر الصف ذو label رقم 3 أيضًا.

ما هي iloc في pandas؟

iloc تستخدم المواقع الرقمية Integer Positions. فكر فيها مثل فهرسة القوائم في بايثون.

df.iloc[row_position, column_position]

مثال:

print(df.iloc[1, 0])

الناتج:

Sara
شرح iloc لاختيار الصفوف والأعمدة بالموقع الرقمي في pandas

اختيار عدة صفوف وأعمدة باستخدام iloc

print(df.iloc[0:3, 0:2])

الناتج:

   name  age
0   Ali   22
1  Sara   25
2  Omar   20

في iloc تكون نهاية slicing غير مشمولة، مثل القوائم العادية في بايثون.

لماذا قد لا يكون loc[0] هو الصف الأول؟

custom_df = df.copy()
custom_df.index = [100, 101, 102, 103, 104]

print(custom_df.loc[100])
print(custom_df.iloc[0])

السطران يعيدان أول صف، لكن الأول استخدم label رقم 100، والثاني استخدم الموقع 0.

ما معنى تصفية الصفوف في pandas؟

التصفية تعني إبقاء الصفوف التي تحقق شرطًا معينًا. الطريقة الأكثر شيوعًا هي إنشاء Boolean mask من قيم True وFalse ثم استخدامه داخل الأقواس المربعة. وإذا أردت تصفية الصفوف واختيار أعمدة محددة في الوقت نفسه، تكون loc مناسبة جدًا.

condition = df["score"] >= 80

print(condition)

الناتج يكون Series من True وFalse.

تصفية DataFrame بشرط واحد

passed = df[df["score"] >= 80]

print(passed)

الناتج:

     name  age       city  score
0     Ali   22       Aden     88
1    Sara   25      Sanaa     91
3    Mona   23       Aden     95
4  Khaled   24  Hadramout     82
تصفية صفوف DataFrame باستخدام الشروط في pandas

استخدام loc مع التصفية واختيار أعمدة محددة

result = df.loc[
    df["score"] >= 80,
    ["name", "score"]
]

print(result)

تصفية الصفوف حسب النص

aden_students = df[df["city"] == "Aden"]

print(aden_students)

تصفية بشرطين باستخدام &

result = df[
    (df["city"] == "Aden")
    &
    (df["score"] >= 90)
]

print(result)

مع Series في pandas استخدم & بدل and، وضع كل شرط بين قوسين.

استخدام OR بالشروط

result = df[
    (df["city"] == "Aden")
    |
    (df["score"] > 90)
]

print(result)

استخدام between و isin

# الأعمار من 21 إلى 24
print(
    df[df["age"].between(21, 24)]
)

# الطلاب من Aden أو Taiz
print(
    df[df["city"].isin(["Aden", "Taiz"])]
)

البحث داخل النص باستخدام str.contains

result = df[
    df["name"].str.contains(
        "a",
        case=False,
        na=False
    )
]

print(result)

إذا كانت الأعمدة تحتوي قيمًا فارغة، راجع أيضًا تنظيف القيم المفقودة في pandas قبل بناء شروط تعتمد على النصوص أو الأرقام.

استخدام query() كطريقة بديلة للفلترة

يمكنك أيضًا استخدام query() لكتابة بعض شروط التصفية بصيغة قصيرة ومقروءة. هي ليست بديلًا إلزاميًا عن Boolean indexing، لكنها مفيدة عندما يكون الشرط واضحًا ويعتمد على أسماء أعمدة بسيطة.

result = df.query('score >= 80 and city == "Aden"')

print(result)

سيعيد هذا الصفوف من Aden التي درجتها 80 فأعلى. للمبتدئ، افهم أولًا Boolean filtering باستخدام الأقواس وloc، ثم استخدم query() عندما تجعل الكود أوضح.

إعادة ضبط index بعد التصفية

passed = df[df["score"] >= 80]
passed = passed.reset_index(drop=True)

print(passed)

مثال عملي: تقرير الطلاب المتفوقين

top_students = df.loc[
    df["score"] >= 90,
    ["name", "city", "score"]
].sort_values(
    by="score",
    ascending=False
)

print(top_students)

الناتج:

   name   city  score
3  Mona   Aden     95
1  Sara  Sanaa     91

حفظ نتيجة التصفية في CSV

top_students.to_csv(
    "top_students.csv",
    index=False,
    encoding="utf-8-sig"
)

أخطاء شائعة عند استخدام loc و iloc

1. استخدام اسم عمود داخل iloc

# خطأ
df.iloc[:, "name"]

# صحيح
df.iloc[:, 0]

# أو بالاسم
df.loc[:, "name"]

2. استخدام and بدل &

# الصحيح
df[
    (df["score"] >= 80)
    &
    (df["city"] == "Aden")
]

3. نسيان الأقواس حول الشروط

ضع كل مقارنة بين قوسين عند استخدام & أو |.

4. كتابة اسم عمود غير صحيح

print(list(df.columns))
أخطاء شائعة عند استخدام loc و iloc وتصفية البيانات في pandas

تمرين عملي

  1. اعرض الصف الثالث باستخدام iloc.
  2. اعرض عمودي name وcity باستخدام loc.
  3. اعرض الطلاب الذين أعمارهم 23 أو أكثر.
  4. اعرض الطلاب من Aden ودرجاتهم 90 فأعلى.
  5. اعرض الطلاب من Aden أو Taiz باستخدام isin().

حل مختصر

print(df.iloc[2])

print(df.loc[:, ["name", "city"]])

print(df[df["age"] >= 23])

print(
    df[
        (df["city"] == "Aden")
        &
        (df["score"] >= 90)
    ]
)

print(
    df[df["city"].isin(["Aden", "Taiz"])]
)

ماذا تتعلم بعد loc و iloc والفلترة؟

مصادر خارجية رسمية للتوسع

الخلاصة

تعلمنا أن loc تختار البيانات بالـLabels، بينما iloc تختارها بالمواقع الرقمية. ورأينا أن تشابه الأرقام في الـindex الافتراضي قد يخفي الفرق، لذلك يجب التفكير في Label مقابل Position لا في «اسم مقابل رقم» فقط.

بعد ذلك طبقنا تصفية الصفوف باستخدام Boolean indexing وloc، ودمجنا الشروط باستخدام & و|، واستخدمنا between() وisin() وstr.contains() وquery().

{alertSuccess} القاعدة المهمة: loc للأسماء، وiloc للمواقع، والشرط المنطقي لتصفية الصفوف. إذا فهمت هذه الثلاثة، ستصبح قادرًا على استخراج الجزء الذي تحتاجه من معظم جداول pandas.

أسئلة شائعة

ما الفرق بين loc و iloc في pandas؟

loc تعتمد على Labels الصفوف والأعمدة، وقد تكون هذه الـLabels نصوصًا أو أرقامًا، بينما iloc تعتمد على المواقع الرقمية التي تبدأ من صفر.

هل loc[0] تعني أول صف؟

ليس دائمًا. تعني الصف الذي يحمل label رقم 0، بينما iloc[0] يعني أول صف بالموقع.

هل نهاية slicing مشمولة في loc؟

تكون النهاية مشمولة عادةً في loc، بينما iloc تستبعد النهاية مثل slicing العادي في بايثون.

كيف أختار عمودين في pandas؟

استخدم df[["name", "score"]] أو df.loc[:, ["name", "score"]].

كيف أصفي الصفوف حسب قيمة عمود؟

استخدم شرطًا مثل df[df["score"] >= 80].

كيف أستخدم شرطين في pandas؟

ضع كل شرط بين قوسين واستخدم & لـ AND أو | لـ OR.

كيف أختار عدة قيم من عمود؟

استخدم isin() مثل df[df["city"].isin(["Aden", "Taiz"])].

كيف أعيد ترتيب index بعد التصفية؟

استخدم reset_index(drop=True) لإنشاء index جديد يبدأ من صفر.

إرسال تعليق

أحدث أقدم