🐼 آموزش جامع کتابخانه Pandas

پردازش، تحلیل، گروه‌بندی و پیش‌پردازش داده‌ها | مقدمه‌ای بر علم داده و هوش مصنوعی

📊 معرفی کتابخانه Pandas

📌 امروز یکی از کتابخانه‌های اصلی علم داده و هوش مصنوعی را یاد می‌گیریم: کتابخانه Pandas

این کتابخانه به شدت پرکاربرد است و یادگیری آن برای ورود به حوزه هوش مصنوعی کاملاً ضروری می‌باشد. Pandas به شما امکان می‌دهد داده‌های جدولی (مانند Excel یا CSV) را به راحتی بارگذاری، پردازش و تحلیل کنید.

💡 علم داده چیست؟ علم داده به معنای جمع‌آوری، پاکسازی، تحلیل و تفسیر داده‌ها برای کشف الگوها و تصمیم‌گیری هوشمندانه است. Pandas یکی از ابزارهای اصلی این حوزه در پایتون می‌باشد.

📁 داده (Data) چیست؟ — نمونه و ویژگی (Feature)

برای شروع کار با کتابخانه Pandas، ابتدا نیاز به یک داده (Data) داریم. هر داده از دو بخش تشکیل می‌شود:

🔍 مثال واقعی: من یاسین هستم. من ویژگی‌هایی دارم مثل: گروه خونی، سن، میزان درآمد و … . به هر کدام از این ویژگی‌ها در علم داده یک «فیچر» می‌گویند.

📄 ساختار فایل CSV — نحوه ذخیره داده

اولین چیزی که باید یاد بگیریم، ذخیره داده‌ها است. یک پوشه می‌سازیم و درون آن یک فایل با نام مثلاً data.csv ایجاد می‌کنیم. پسوند .csv مخفف Comma Separated Values است و داده‌ها در آن با کاما از هم جدا می‌شوند.

📝 محتوای فایل data.csv
Name,age,salary,smoker
Yasin,21,350000,No
📘 توضیح ساختار: خط اول (هدر) فقط یک بار نوشته می‌شود و شامل نام ویژگی‌هاست. خطوط بعدی هر کدام یک نمونه (رکورد) را نشان می‌دهند. اطلاعات به صورت دیکشنری ذخیره می‌شوند (هر ستون یک کلید و هر ردیف یک مقدار).

می‌توانیم به تعداد دلخواه نمونه به فایل اضافه کنیم. مثلاً:

📝 نمونه فایل CSV با دو ردیف
Name,age,salary,smoker
Yasin,21,350000,No
Ali,20,32434,Yes

⚙️ نصب کتابخانه Pandas

قبل از هر کاری باید Pandas را نصب کنید. روش نصب بستگی به محیط برنامه‌نویسی شما دارد:

📦 دستور نصب
pip install pandas
💡 نکته: اگر از Jupyter Notebook یا Google Colab استفاده می‌کنید، معمولاً Pandas از قبل نصب شده است. در غیر این صورت، دستور بالا را در یک سلول با علامت % اجرا کنید: %pip install pandas

📝 روش اول — ایجاد داده با دیکشنری در پایتون

روش دوم ذخیره داده (غیر از فایل CSV) استفاده از دیکشنری در خود کد پایتون است. این روش برای داده‌های کوچک و آزمایشی مناسب است.

🐍 تعریف دیتا با دیکشنری
import pandas as pd

data = {
    "name": ["yasin", "ali"],
    "age": [20, 21]
}

print(type(data))
توضیح: خروجی تابع type(data) نشان می‌دهد که داده از نوع dict (دیکشنری) است. اما در Pandas برای تحلیل داده به DataFrame نیاز داریم.

برای تبدیل دیکشنری به DataFrame از کد زیر استفاده می‌کنیم:

🐍 تبدیل دیکشنری به DataFrame
import pandas as pd

data = {
    "name": ["yasin", "ali"],
    "age": [20, 21]
}

df = pd.DataFrame(data)
print(type(df))
print(df)
📘 نکته مهم: DataFrame ساختار اصلی در Pandas است که داده‌ها را به صورت جدول (سطرها و ستون‌ها) ذخیره می‌کند. به کمک pd.DataFrame() می‌توانیم انواع داده‌ها (دیکشنری، لیست لیست‌ها، فایل CSV و ...) را تبدیل به DataFrame کنیم.

📂 روش دوم — کار با فایل CSV (روش اصلی و پرکاربرد)

در بیشتر پروژه‌های واقعی، داده‌ها به صورت فایل csv ذخیره می‌شوند. برای خواندن این فایل‌ها از تابع pd.read_csv() استفاده می‌کنیم.

شرط مهم برای اجرا

⚠️ فایلی که کد پایتون در آن نوشته شده و فایل CSV شما باید در یک پوشه (فولدر) مشترک قرار داشته باشند. در غیر این صورت، کد با خطا مواجه می‌شود.
🐍 خواندن فایل CSV (فایل در همان پوشه)
import pandas as pd
df = pd.read_csv('data.csv')
print(df)

اگر فایل CSV در پوشه دیگری قرار دارد، باید آدرس کامل فایل را به همراه حرف r جلوی آن بنویسید:

🐍 خواندن فایل با آدرس کامل
import pandas as pd
df = pd.read_csv(r'C:\Users\YourName\Desktop\data.csv')
print(df)
💡 توضیح r: حرف r جلوی رشته به پایتون می‌گوید که این رشته یک «رشته خام» (raw string) است و کاراکترهای خاص مانند \ را نباید به عنوان فرار (escape) تفسیر کند. این کار مخصوصاً برای آدرس‌های ویندوز مفید است.

🔍 دستورات اولیه برای بررسی داده (Data Exploration)

بعد از بارگذاری داده، معمولاً می‌خواهیم ساختار و وضعیت کلی آن را ببینیم. دستورات زیر پرکاربردترین‌ها هستند:

۱. مشاهده چند سطر اول — head()

🐍 نمایش ۵ سطر اول
df.head()
📌 head() به طور پیش‌فرض ۵ سطر اول را نمایش می‌دهد. برای تعداد دلخواه می‌توانید عدد داخل پرانتز قرار دهید، مثلاً df.head(10). این دستور برای دیدن ساختار داده بدون نمایش کل جدول بسیار مفید است.

۲. مشاهده چند سطر آخر — tail()

🐍 نمایش ۵ سطر آخر
df.tail()
📌 tail() پنج سطر آخر داده را نشان می‌دهد. این دستور برای بررسی انتهای داده و مشاهده آخرین رکوردها کاربرد دارد.

۳. ابعاد داده — shape

🐍 تعداد سطرها و ستون‌ها
df.shape
📊 خروجی به صورت (تعداد سطر, تعداد ستون) است. سطرها همان نمونه‌ها (افراد) و ستون‌ها همان ویژگی‌ها هستند.

۴. مشاهده نام ستون‌ها — columns

🐍 لیست ستون‌ها (ویژگی‌ها)
df.columns
📌 این دستور نام تمام ویژگی‌های موجود در داده را نمایش می‌دهد.

۵. آمار توصیفی — describe()

🐍 آمار داده‌های عددی
df.describe()
📊 describe() برای ستون‌های عددی، شاخص‌هایی مثل: تعداد (count)، میانگین (mean)، انحراف معیار (std)، حداقل (min)، صدک‌ها (25%, 50%, 75%) و حداکثر (max) را محاسبه می‌کند. این دستور برای شناخت اولیه از توزیع داده بسیار مفید است.

۶. اطلاعات کلی و وجود داده‌های ناقص — info()

🐍 اطلاعات جامع DataFrame
df.info()
⚠️ info() تعداد کل رکوردها، تعداد ستون‌ها، نوع داده هر ستون و مهم‌تر از همه تعداد مقادیر غیرناقص (Non-Null Count) را نشان می‌دهد. اگر تعداد Non-Null کمتر از تعداد کل ردیف‌ها باشد، یعنی داده ناقص (Missing Value) داریم که باید پیش‌پردازش شود.

✂️ اسلایس کردن (Slicing) — انتخاب بخش خاصی از داده

گاهی فقط می‌خواهیم بخشی از DataFrame را ببینیم. مثلاً چند ردیف از یک ستون خاص.

🐍 انتخاب ردیف‌های ۲ تا ۱۰ از ستون age
df['age'][2:10]
📌 نحوه کار: df['age'] ستون سن را انتخاب می‌کند. سپس [2:10] ردیف‌های با ایندکس ۲ تا ۹ را برمی‌گرداند (در پایتون، برش از ابتدا شامل و از انتها خارج است).

🔢 value_counts — تعداد مقادیر تکراری

با value_counts() می‌توانیم ببینیم هر مقدار در یک ستون چند بار تکرار شده است. این دستور برای ستون‌های دسته‌ای (Category) بسیار مفید است.

🐍 تعداد هر سن در داده
df['age'].value_counts()

با استفاده از normalize=True درصد (نسبت) هر مقدار را به جای تعداد مطلق نشان می‌دهد:

🐍 درصد افراد سیگاری و غیر سیگاری
df['smoker'].value_counts(normalize=True) * 100
📊 مثلاً خروجی می‌گوید: «چند درصد افراد سیگاری هستند و چند درصد سیگاری نیستند». ضرب در ۱۰۰ برای تبدیل به درصد است.

📊 CrossTab — جدول متقاطع

pd.crosstab() یک جدول دو بعدی می‌سازد که فراوانی ترکیب دو ویژگی را نشان می‌دهد.

🐍 بررسی رابطه بین سن و سیگاری بودن
pd.crosstab(df.age, df.smoker)
📌 این دستور گروه‌بندی می‌کند بر حسب «سیگاری بودن» و «سن». خروجی نشان می‌دهد که هر سن چه تعداد سیگاری و چه تعداد غیرسیگاری دارد. این روش برای تحلیل رابطه بین دو متغیر دسته‌ای بسیار کاربرد دارد.

🔍 فیلتر کردن داده — نمایش بر اساس شرط

برای نمایش ردیف‌هایی که یک شرط خاص را دارند، از فیلتر استفاده می‌کنیم.

🐍 نمایش افراد بالای ۱۸ سال
up18 = df[df.age > 18]
up18
df.age > 18 یک آرایه بولی (True/False) می‌سازد. سپس با قرار دادن آن داخل df[...]، فقط ردیف‌هایی که شرط در آن‌ها True است انتخاب می‌شود.

برای جستجوی یک شخص خاص (مثلاً «yasin»):

🐍 جستجوی شخص با نام yasin
df[df.name.str.contains('yasin')]
📘 str.contains() یک متد رشته‌ای است که بررسی می‌کند آیا عبارت مورد نظر درون متن وجود دارد یا نه. این روش برای جستجوی متنی در ستون‌های رشته‌ای عالی است.

🔑 unique() — مقادیر یکتا (تکرار نشده)

unique() مقادیری که در یک ستون وجود دارند را بدون تکرار برمی‌گرداند. این دستور برای شناسایی «دسته‌های» مختلف یک ویژگی کاربرد دارد.

🐍 مشاهده حالت‌های مختلف ویژگی smoker
df.smoker.unique()
💡 مثلاً اگر ویژگی «روز هفته» باشد و داده شامل {شنبه, یکشنبه, دوشنبه} باشد، unique() این سه مقدار را بدون تکرار برمی‌گرداند. این کار به ما می‌گوید که چند نوع داده در آن ویژگی وجود دارد.

📊 گروه‌بندی داده — groupby

با استفاده از groupby() می‌توانیم داده‌ها را بر اساس یک ستون گروه‌بندی کنیم و عملیات آماری روی هر گروه انجام دهیم.

🐍 گروه‌بندی بر اساس سن و شمارش تعداد
df.groupby('age').count()
📌 groupby('age') داده را بر اساس مقادیر مختلف سن دسته‌بندی می‌کند. سپس count() تعداد رکوردهای هر گروه را محاسبه می‌کند.
⚠️ نکته مهم درباره groupby و mean: اگر بخواهیم میانگین یک ویژگی (مثلاً سیگاری بودن) را بر حسب سن محاسبه کنیم، باید مطمئن شویم که آن ویژگی به صورت عددی است. df.groupby('age')[smoker].mean() زمانی کار می‌کند که ستون smoker مقادیر ۰ و ۱ داشته باشد (نه Yes/No). در ادامه در بخش پیش‌پردازش یاد می‌گیریم چگونه داده‌های متنی را به عددی تبدیل کنیم.
🐍 میانگین سیگاری بودن بر حسب سن (پس از عددی کردن)
df.groupby('age')['smoker'].mean()

📊 مرتب‌سازی داده — sort_values

برای مرتب‌سازی داده بر اساس یک ویژگی خاص از sort_values() استفاده می‌کنیم. می‌توان بر اساس کم به زیاد (صعودی) یا زیاد به کم (نزولی) مرتب کرد.

🐍 مرتب‌سازی بر اساس سن (صعودی)
df.sort_values('age')
📌 برای مرتب‌سازی نزولی از ascending=False استفاده کنید: df.sort_values('age', ascending=False)

📌 جمع‌بندی کدهای ابتدایی Pandas

تا اینجا کدهای ابتدایی Pandas را یاد گرفتید و یک کتابخانه پایتون به کتابخانه ذهنی شما اضافه شد. حالا بریم برای مبحث جدید و مهم: پیش‌پردازش داده (Data Preprocessing)

⚡ پیش‌پردازش داده (Data Preprocessing) — قلب علم داده

⚠️ داده‌ها همیشه تمیز و آماده نیستند! ممکن است داده‌ای داشته باشیم که نوع داده آن str (رشته‌ای) باشد. مثلاً جنسیت به جای عدد با «مرد/زن» نوشته شده باشد، یا گروه خونی به صورت کلمه باشد. سیستم (مدل هوش مصنوعی) از این داده‌ها درکی ندارد و ما باید آن‌ها را پیش‌پردازش کرده و به عدد تبدیل کنیم.

برای شروع پیش‌پردازش، طبق روال زیر عمل می‌کنیم:

  1. کتابخانه Pandas را ایمپورت می‌کنیم (import pandas as pd)
  2. فایل CSV را با read_csv می‌خوانیم
  3. با df.shape ابعاد داده را می‌بینیم
  4. با df.info() اطلاعات کلی و وجود داده‌های ناقص را بررسی می‌کنیم
  5. با df.describe() آمار توصیفی می‌بینیم
📌 نکته: این مراحل را برای هر دیتایی که به شما می‌دهند، به ترتیب انجام دهید.

🔄 تبدیل داده‌های رشته‌ای (str) به عددی — جایگزینی با replace

برای اینکه سیستم ما فقط اعداد را بفهمد، باید ستون‌هایی که داده‌هایشان غیرعددی است (مثل ستون smoker با مقادیر Yes/No) را به عدد تبدیل کنیم. این کار را با دستور replace() انجام می‌دهیم.

🐍 تبدیل Yes/No به 1 و 0
df.replace({'smoker':{'yes':0, 'no':1}}, inplace=True)
توضیح کامل:
  • replace() یک تابع برای جایگزینی مقادیر است.
  • {'smoker':{'yes':0, 'no':1}} یعنی در ستون smoker هرجا مقدار yes بود به 0 و هرجا no بود به 1 تبدیل شود.
  • inplace=True یعنی تغییرات را مستقیماً روی همان DataFrame اعمال کن (بدون نیاز به ساخت یک کپی جدید). اگر inplace=True را ننویسیم، تغییرات فقط به صورت موقت نمایش داده می‌شوند و در DataFrame اصلی ذخیره نمی‌شوند.
  • حالا دیگر سیستم می‌فهمد که سیگاری بودن یعنی 0 و سیگاری نبودن یعنی 1.

برای تأیید تغییرات، دوباره df.head() را اجرا کنید تا ببینید ستون smoker به اعداد تبدیل شده است.

🗑️ حذف ستون‌های غیرضروری (مثل ستون name)

گاهی برخی ستون‌ها (مثل name) برای تحلیل ما کاربردی ندارند. بهتر است آن‌ها را حذف کنیم تا داده تمیزتر و پردازش سریع‌تر شود.

🐍 حذف ستون name
df = df.drop(columns=['name'])
df.head()
📌 توضیح: drop(columns=['name']) ستون name را حذف می‌کند. نتیجه را دوباره در df ذخیره می‌کنیم تا تغییرات دائمی شود. سپس با df.head() تأیید می‌کنیم که ستون name دیگر وجود ندارد.
✅ پیش‌پردازش داده تمام شد! حالا داده ما آماده است تا وارد مدل‌های هوش مصنوعی یا تحلیل‌های پیشرفته شود.

📌 جمع‌بندی نهایی — آنچه در این جزوه کامل یاد گرفتیم

تبریک! شما با یادگیری Pandas گام بزرگی به سمت علم داده و هوش مصنوعی برداشتید. حالا می‌توانید داده‌های واقعی را بارگذاری، تمیز و تحلیل کنید. هر چه بیشتر تمرین کنید، حرفه‌ای‌تر خواهید شد.
✅ کپی شد!