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

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

بعد أن تتعلم قراءة ملف CSV باستخدام pandas، وتفهم شكل DataFrame والصفوف والأعمدة، ستحتاج إلى خطوة تستخدمها تقريبًا في كل عملية تحليل بيانات: كيف تختار صفًا معينًا؟ كيف تعرض أعمدة محددة فقط؟ وكيف تصفي الجدول بحيث تبقي الصفوف التي تحقق شرطًا مثل درجة أكبر من 80 أو مدينة تساوي Aden؟

مكتبة pandas توفر أكثر من طريقة لاختيار البيانات. من أهم الأدوات loc للاختيار باستخدام أسماء الصفوف والأعمدة، وiloc للاختيار باستخدام المواقع الرقمية. كما يمكنك استخدام الشروط المنطقية لتصفية الصفوف دون كتابة حلقة for على كل سجل.

في هذا المقال سنستخدم جدول طلاب صغيرًا ونطبق عليه خطوة بخطوة: اختيار عمود واحد، اختيار أكثر من عمود، اختيار صفوف باستخدام loc وiloc، ثم تصفية البيانات بشرط واحد أو أكثر، مع شرح الأخطاء الشائعة التي تربك المبتدئين.

{alertInfo} الفكرة ببساطة: استخدم loc عندما تريد الاختيار بأسماء الصفوف أو الأعمدة، واستخدم iloc عندما تريد الاختيار بالموقع الرقمي، واستخدم شرطًا منطقيًا عندما تريد الاحتفاظ فقط بالصفوف التي تحقق قاعدة معينة.

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

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

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

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 وأسماء الأعمدة.

df.loc[rows, columns]

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

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

الناتج:

Sara
شرح loc لاختيار الصفوف والأعمدة بالاسم في 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 غير مشمولة، مثل القوائم العادية في Python.

الفرق بين loc و iloc

النقطة loc iloc
طريقة الاختيار بأسماء Labels بالمواقع الرقمية Positions
اختيار عمود df.loc[:, "name"] df.iloc[:, 0]
اختيار صف df.loc[1] df.iloc[1]
نهاية 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؟

التصفية تعني إبقاء الصفوف التي تحقق شرطًا معينًا.

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)

إعادة ضبط 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"])]
)

روابط داخلية مفيدة من بايثون العرب

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

الخلاصة

تعلمنا كيف نختار البيانات داخل DataFrame باستخدام أسماء الأعمدة مباشرة، ثم استخدمنا loc للاختيار بالـ Labels وiloc للاختيار بالمواقع الرقمية.

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

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

أسئلة شائعة

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

loc تعتمد على أسماء الصفوف والأعمدة Labels، بينما iloc تعتمد على المواقع الرقمية التي تبدأ من صفر.

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

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

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

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

كيف أختار عمودين في 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 جديد يبدأ من صفر.

إرسال تعليق

أحدث أقدم