تصفية الصفوف
استخدم الشروط المنطقية للاحتفاظ بالصفوف المطابقة لمعاييرك فقط في إطار بيانات pandas.
- تصفية الصفوف باستخدام شرط منطقي واحد
- دمج شروط متعددة باستخدام عاملَي & و |
- استخدام .isin() و .between() لأنماط تصفية شائعة
- التصفية بأساليب النصوص باستخدام أداة .str
التصفية بالشروط المنطقية
التصفية هي طريقة تركيزك على الجزء المهم من البيانات. تنشئ قناعًا منطقيًا (boolean mask) ، كائن Series من قيم True/False ، وتستخدمه لتحديد الصفوف.
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")
# Filter passengers older than 30
older = df[df["Age"] > 30]
print(older.shape) # fewer rows than original 891التعبير df["Age"] > 30 يُنتج كائن Series منطقيًا:
0 True
1 True
2 False
3 True
...
تمريره داخل df[...] يحتفظ فقط بالصفوف التي تكون قيمتها True.
دمج الشروط
استخدم & (و) و | (أو) لدمج الشروط. يجب وضع كل شرط بين قوسين:
# Female passengers in first class
first_class_female = df[(df["Sex"] == "female") & (df["Pclass"] == 1)]
print(first_class_female.head())# Passengers younger than 25 OR older than 60
young_or_old = df[(df["Age"] < 25) | (df["Age"] > 60)]
print(young_or_old.shape)خطأ شائع: استخدام and/or بدلًا من &/|. عاملَا بايثون and/or لا يعملان على مستوى العناصر على كائنات Series في pandas وسيسببان خطأ.
استخدام .isin() لقيم متعددة
عندما تحتاج إلى المطابقة مع قائمة قيم، استخدم .isin():
# Passengers who embarked from Cherbourg or Southampton
embarked_filter = df[df["Embarked"].isin(["C", "S"])]# Passengers in class 1 or 2
upper_classes = df[df["Pclass"].isin([1, 2])]استخدام .between() للنطاقات
طريقة .between() أنظف من ربط مقارنتين:
# Passengers aged 20 to 30 (inclusive by default)
twenties = df[df["Age"].between(20, 30)]
print(twenties.shape)هذا مكافئ لـ df[(df["Age"] >= 20) & (df["Age"] <= 30)] لكنه أكثر قابلية للقراءة.
التصفية بأساليب النصوص
تتيح لك أداة .str تطبيق عمليات النصوص على عمود كامل:
# Passengers whose name contains "Master" (a title)
masters = df[df["Name"].str.contains("Master", na=False)]
print(masters.shape)# Passengers whose ticket starts with "A"
a_tickets = df[df["Ticket"].str.startswith("A", na=False)]الوسيط na=False يعالج القيم المفقودة بلطف ، بدونها، ستسبب قيم NaN أخطاء.
التصفية باستخدام .query()
بالنسبة للفلاتر المعقدة، يوفر .query() بديلًا مقروءًا:
# Equivalent to df[(df["Age"] > 25) & (df["Survived"] == 1)]
survivors_over_25 = df.query("Age > 25 and Survived == 1")قراءة هذا سطرية تقريبًا مثل نص إنجليزي وتتجنب تكرار صياغة df["column"].
تخزين الفلاتر في متغيرات
بالنسبة للشروط المعقدة، خزّن القناع المنطقي في متغير أولًا:
is_female = df["Sex"] == "female"
is_first_class = df["Pclass"] == 1
is_survived = df["Survived"] == 1
# Combine them
result = df[is_female & is_first_class & is_survived]
print(f"Female first-class survivors: {len(result)}")هذا الأسلوب يجعل شفرتك أسهل بكثير في القراءة وتصحيح الأخطاء.
جرّب بنفسك
من مجموعة بيانات تيتانيك، صفِّ للعثور على:
- جميع الركاب الذين دفعوا ثمن تذكرة أكثر من 100
- جميع الركابات في الدرجة الثالثة
- جميع الركاب الذين يحوي اسمهم لقب “Mrs”
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")
high_fare = df[df["Fare"] > 100]
print(f"High fare passengers: {len(high_fare)}")
third_class_female = df[(df["Sex"] == "female") & (df["Pclass"] == 3)]
print(f"Third-class females: {len(third_class_female)}")
mrs = df[df["Name"].str.contains("Mrs", na=False)]
print(f"Passengers with title Mrs: {len(mrs)}")خلاصات رئيسية
- الفهرسة المنطقية
df[mask]هي آلية التصفية الأساسية في pandas - استخدم
&للـAND و|للـOR ، لفّ كل شرط على حدة بين قوسين دائمًا .isin()يطابق قائمة؛.between()يتعامل مع النطاقات بنظافة.str.contains()يصفّي بمطابقة نص فرعي ، استخدمna=Falseللأمان
تحدي التطبيق
من مجموعة بيانات تيتانيك، ابحث عن جميع الركاب الذين: (1) كانوا ذكورًا، (2) في الدرجة الثانية أو الثالثة، (3) تتراوح أعمارهم بين 18 و 35 عامًا، و(4) نجوا. كم عدد الركاب المطابقين للشروط الأربعة جميعها؟
1. كيف تصفِّي الصفوف التي يكون فيها العمر أكبر من 30؟
2. ماذا يُرجع df[df.age > 30]؟
3. كيف تصفِّي بأكثر من شرط؟