تطبيع الأنواع والنصوص والتواريخ
نفس القيمة بأشكالٍ شتّى؛ كيف نوحّدها كي يصدق الحساب والتجميع؟ ⏱ نحو 45 دقيقة.
- تكتشف أن الأعمدة النصّية تمنع الحساب.
- تطبّع الأرقام بإزالة الرموز والتحويل.
- توحّد النصوص بإزالة المسافات وتصحيح الإملاء.
- توحّد صيغ التواريخ المختلطة.
١نفس المعنى، أشكال مختلفة
بعد ملء الفجوات تبقى فوضى الأشكال: السعر نصٌّ فيه فاصلة وكلمة «ريال»، والمدينة بمسافات زائدة وإملاء مختلف، والتاريخ بصيغٍ متعدّدة. التطبيع يوحّدها كي تصلح للحساب والتجميع.
import pandas as pddf = pd.DataFrame({ "price": ["300", "1,200", "90 ريال", "450"], "city": [" الرياض", "جدة ", "الريــاض", " جدة"], "date": ["2025/03/01", "01-03-2025", "2025-03-02", "3/3/2025"],})print(df.dtypes) # كلها object (نصّ) — لا يمكن حساب priceprint(df["price"].sum()) # يلصق النصوص! ليس جمعًا
الخطر الصامت: "300" + "1,200" يعطي "3001,200" لا رقمًا. لا بدّ من التحويل قبل أي حساب.
٢تطبيع الأرقام والنصوص
import pandas as pddf = pd.DataFrame({ "price": ["300", "1,200", "90 ريال", "450"], "city": [" الرياض", "جدة ", "الريــاض", " جدة"], "date": ["2025/03/01", "01-03-2025", "2025-03-02", "3/3/2025"],})# السعر: أزل غير الأرقام ثم حوّلdf["price"] = (df["price"].str.replace(r"[^0-9]", "", regex=True).astype(int))print("مجموع الأسعار:", df["price"].sum()) # المدينة: أزل المسافات ووحّد الإملاءdf["city"] = df["city"].str.strip().str.replace("ـ", "", regex=False)print(df["city"].value_counts())
str.strip يزيل المسافات الطرفية، وstr.replace يصحّح الإملاء (هنا أزلنا التطويل ـ). بعدها يتّحد «الرياض» المتعدّد في فئةٍ واحدة.
٣توحيد التواريخ
pd.to_datetime ذكيّ: يفهم صيغًا مختلفة ويوحّدها نوعًا زمنيًّا واحدًا. مرّر format="mixed" حين تختلف الصيغ:
import pandas as pddf = pd.DataFrame({ "price": ["300", "1,200", "90 ريال", "450"], "city": [" الرياض", "جدة ", "الريــاض", " جدة"], "date": ["2025/03/01", "01-03-2025", "2025-03-02", "3/3/2025"],})df["date"] = pd.to_datetime(df["date"], format="mixed", dayfirst=False)print(df["date"])print("النوع:", df["date"].dtype)print("أقدم تاريخ:", df["date"].min().date())
توقّع وتحقّق
قبل حساب عمود أسعار نصّي يجب:
لإزالة المسافات الطرفية من نصّ:
لتوحيد صيغ التاريخ المختلفة:
« الرياض» و«الرياض» قبل strip هما:
الخلاصة
- التطبيع يوحّد أشكال نفس المعنى كي تصلح للحساب والتجميع.
- حوّل الأرقام النصّية (أزل الفواصل والكلمات) قبل أي عملية حسابية.
str.stripوstr.replaceيوحّدان النصوص فتتّحد الفئات المتشظّية.to_datetime(format="mixed")يوحّد صيغ التواريخ المختلفة نوعًا واحدًا.
تحدٍّ برمجي: طبّع ثم احسب
متقدمطبّع عمود price النصّي إلى أرقام، ووحّد city بإزالة المسافات، ثم اطبع مجموع الأسعار وعدد المدن الفريدة.
- حوّل
priceإلى رقم بإزالة غير الأرقام. - نظّف
cityبـ strip، ثم اطبع مجموع الأسعار وعدد المدن الفريدة.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
import pandas as pddf = pd.DataFrame({ "price": ["100", "2,500", "80 ر.س", "300"], "city": [" جدة", "جدة ", " الرياض", "الرياض "],})# طبّع price و city ثم اطبع مجموع الأسعار وعدد المدن الفريدة
💡 تلميح 1
str.replace(r"[^0-9]", "", regex=True).astype(int).💡 تلميح 2
df["city"].str.strip().nunique().حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
import pandas as pddf = pd.DataFrame({ "price": ["100", "2,500", "80 ر.س", "300"], "city": [" جدة", "جدة ", " الرياض", "الرياض "],})df["price"] = df["price"].str.replace(r"[^0-9]", "", regex=True).astype(int)df["city"] = df["city"].str.strip()print(int(df["price"].sum()))print(df["city"].nunique())