بعد أن تتعلم قراءة ملف 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
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 غير مشمولة، مثل القوائم العادية في 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
استخدام 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))
تمرين عملي
- اعرض الصف الثالث باستخدام
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"])]
)
روابط داخلية مفيدة من بايثون العرب
- تحليل البيانات ببايثون للمبتدئين: من أين تبدأ؟
- قراءة ملف CSV باستخدام pandas خطوة بخطوة
- تنظيف البيانات والتعامل مع القيم الفارغة باستخدام pandas
- فهم DataFrame وعرض أول الصفوف باستخدام pandas
- تعلم الذكاء الاصطناعي ببايثون من الصفر
مصادر خارجية رسمية للتوسع
- دليل الفهرسة واختيار البيانات في pandas
- توثيق DataFrame.loc الرسمي
- توثيق DataFrame.iloc الرسمي
- كيفية إنشاء subset من DataFrame في دليل pandas
الخلاصة
تعلمنا كيف نختار البيانات داخل 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 جديد يبدأ من صفر.



