تنظيف البيانات غير جذاب ويستغرق وقتاً طويلاً وضروري تماماً. تُظهر الدراسات باستمرار أن محترفي البيانات يقضون 60–80% من وقتهم في تنظيف البيانات وإعدادها قبل أن يبدأ أي تحليل. Pandas يجعل هذه العملية أسرع وقابلة للتكرار وقابلة للتدقيق.
ابدأ دائماً بهذه الأوامر الثلاثة
قبل لمس أي مجموعة بيانات، شغّل:
df.info() — أنواع البيانات وعدد القيم غير الفارغة واستخدام الذاكرة
df.describe() — ملخص إحصائي للأعمدة الرقمية
df.isnull().sum() — عدد القيم المفقودة لكل عمود
هذه الأوامر الثلاثة تكشف 90% من مشكلات جودة البيانات في أقل من 30 ثانية.
التعامل مع القيم المفقودة
القيم المفقودة هي أكثر مشكلات جودة البيانات شيوعاً. استراتيجيتك تعتمد على السياق:
df.dropna(subset=['critical_column']) — احذف الصفوف حيث عمود رئيسي فارغ
df.fillna(0) — استبدل NULLs بالصفر
df.fillna(df['column'].median()) — املأ بالوسيط
df.fillna(method='ffill') — الملء للأمام (مفيد لبيانات السلاسل الزمنية)
إصلاح أنواع البيانات
أنواع البيانات الخاطئة تسبب أخطاء صامتة. أصلحها مبكراً:
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df['revenue'] = pd.to_numeric(df['revenue'], errors='coerce')
وسيطة errors='coerce' تحوّل القيم غير القابلة للتحليل إلى NaN بدلاً من التعطّل.
توحيد النص
النص غير المتسق يدمر دقة GROUP BY. 'Egypt' و'egypt' و'EGYPT' و' Egypt ' ستُعدّ أربع دول مختلفة:
df['country'] = df['country'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()
إزالة التكرارات
df.duplicated().sum() يُظهر كم صف مكرر موجود.
df.drop_duplicates() يزيل التكرارات المطابقة.
df.drop_duplicates(subset=['customer_id', 'order_date']) يزيل التكرارات بناءً على أعمدة محددة.
اكتشاف القيم الشاذة والتعامل معها
طريقة IQR تحدد القيم الشاذة الإحصائية دون افتراض توزيع:
Q1 = df['sales'].quantile(0.25)
Q3 = df['sales'].quantile(0.75)
IQR = Q3 - Q1
df_clean = df[(df['sales'] >= Q1 - 1.5*IQR) & (df['sales'] <= Q3 + 1.5*IQR)]افحص القيم الشاذة دائماً قبل إزالتها — قد تكون أخطاء إدخال بيانات أو أحداث متطرفة حقيقية.
ابنِ خط أنابيب قابل لإعادة الاستخدام
المكسب الحقيقي في الكفاءة يأتي من تعبئة جميع خطوات التنظيف في دالة:
def clean_sales_data(df):
df = df.copy()
df.drop_duplicates(inplace=True)
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df['revenue'] = pd.to_numeric(df['revenue'], errors='coerce')
df['region'] = df['region'].str.strip().str.title()
df.dropna(subset=['date', 'revenue'], inplace=True)
return dfاستدع هذه الدالة في كل مرة تحمّل فيها مجموعة البيانات. متسقة وقابلة للتكرار وقابلة للتدقيق.
