طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 16 · الوحدة 8: تحليل وتحويل البيانات المجمعة

تطبيع الأنواع والنصوص والتواريخ

نفس القيمة بأشكالٍ شتّى؛ كيف نوحّدها كي يصدق الحساب والتجميع؟ ⏱ نحو 45 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تكتشف أن الأعمدة النصّية تمنع الحساب.
  • تطبّع الأرقام بإزالة الرموز والتحويل.
  • توحّد النصوص بإزالة المسافات وتصحيح الإملاء.
  • توحّد صيغ التواريخ المختلطة.

١نفس المعنى، أشكال مختلفة

بعد ملء الفجوات تبقى فوضى الأشكال: السعر نصٌّ فيه فاصلة وكلمة «ريال»، والمدينة بمسافات زائدة وإملاء مختلف، والتاريخ بصيغٍ متعدّدة. التطبيع يوحّدها كي تصلح للحساب والتجميع.

main.py
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())   # يلصق النصوص! ليس جمعًا
Shell×
>>> %Run main.py
price str
city str
date str
dtype: object
3001,20090 ريال450
>>>

الخطر الصامت: "300" + "1,200" يعطي "3001,200" لا رقمًا. لا بدّ من التحويل قبل أي حساب.

٢تطبيع الأرقام والنصوص

main.py
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())
Shell×
>>> %Run main.py
مجموع الأسعار: 2040
city
الرياض 2
جدة 2
Name: count, dtype: int64
>>>

str.strip يزيل المسافات الطرفية، وstr.replace يصحّح الإملاء (هنا أزلنا التطويل ـ). بعدها يتّحد «الرياض» المتعدّد في فئةٍ واحدة.

٣توحيد التواريخ

pd.to_datetime ذكيّ: يفهم صيغًا مختلفة ويوحّدها نوعًا زمنيًّا واحدًا. مرّر format="mixed" حين تختلف الصيغ:

main.py
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())
Shell×
>>> %Run main.py
0 2025-03-01
1 2025-01-03
2 2025-03-02
3 2025-03-03
Name: date, dtype: datetime64[us]
النوع: datetime64[us]
أقدم تاريخ: 2025-01-03
>>>

توقّع وتحقّق

قبل حساب عمود أسعار نصّي يجب:

لإزالة المسافات الطرفية من نصّ:

لتوحيد صيغ التاريخ المختلفة:

« الرياض» و«الرياض» قبل strip هما:

الخلاصة

تحدٍّ برمجي: طبّع ثم احسب

متقدم

طبّع عمود price النصّي إلى أرقام، ووحّد city بإزالة المسافات، ثم اطبع مجموع الأسعار وعدد المدن الفريدة.

المطلوب:
  • حوّل price إلى رقم بإزالة غير الأرقام.
  • نظّف city بـ strip، ثم اطبع مجموع الأسعار وعدد المدن الفريدة.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
import pandas as pddf = pd.DataFrame({    "price": ["100", "2,500", "80 ر.س", "300"],    "city":  [" جدة", "جدة ", " الرياض", "الرياض "],})# طبّع price و city ثم اطبع مجموع الأسعار وعدد المدن الفريدة
المطلوب×
2980
2
💡 تلميح 1
السعر: str.replace(r"[^0-9]", "", regex=True).astype(int).
💡 تلميح 2
المدن الفريدة: df["city"].str.strip().nunique().

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
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())
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس