الفرق بين 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
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
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
استخدام 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))
تمرين عملي
- اعرض الصف الثالث باستخدام
iloc. - اعرض عمودي
nameوcityباستخدامloc. - اعرض الطلاب الذين أعمارهم 23 أو أكثر.
- اعرض الطلاب من Aden ودرجاتهم 90 فأعلى.
- اعرض الطلاب من 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 والفلترة؟
- مسار تحليل البيانات ببايثون لترتيب الخطوات التالية بعد اختيار البيانات.
- تحليل البيانات ببايثون للمبتدئين: من أين تبدأ؟ لفهم المسار من قراءة البيانات إلى تحليلها.
- مقارنة ملفين Excel واستخراج الصفوف المختلفة باستخدام pandas كتطبيق عملي يعتمد على اختيار الصفوف والأعمدة.
مصادر خارجية رسمية للتوسع
- دليل الفهرسة واختيار البيانات في pandas
- توثيق DataFrame.loc الرسمي
- توثيق DataFrame.iloc الرسمي
- كيفية إنشاء subset من DataFrame في دليل pandas
الخلاصة
تعلمنا أن 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 جديد يبدأ من صفر.



