اگر با دادههای جدولی، فایلهای اکسل، گزارشهای فروش یا خروجی سامانهها سروکار دارید، کتابخانه Pandas یکی از مهمترین ابزارهایی است که باید در پایتون یاد بگیرید. Pandas به شما امکان میدهد دادهها را وارد کنید، ساختار آنها را بشناسید، مقادیر نامعتبر را اصلاح کنید، محاسبات آماری انجام دهید و در نهایت نتیجه را به شکل یک فایل قابل استفاده تحویل بگیرید. بسیاری از کارهایی که در نرمافزارهای صفحه گسترده به چندین فرمول و عملیات دستی نیاز دارند، با Pandas در چند دستور مشخص و تکرارپذیر انجام میشوند.
در این آموزش Pandas در پایتون، مفاهیم را از پایه بررسی میکنیم و سپس به سراغ یک مثال عملی میرویم. هدف فقط آشنایی با چند دستور پراکنده نیست؛ بلکه میخواهیم روند استاندارد تحلیل داده را از ورود اطلاعات تا تهیه گزارش نهایی یاد بگیریم.
Pandas چیست و چه کاربردی دارد؟
Pandas یک کتابخانه متنباز پایتون برای مدیریت و تحلیل دادههای ساختاریافته است. منظور از داده ساختاریافته، اطلاعاتی است که معمولاً در قالب سطر و ستون ذخیره میشود؛ مانند فهرست مشتریان، تراکنشهای مالی، اطلاعات محصولات، نتایج نظرسنجی یا دادههای ثبتشده توسط حسگرها.
قدرت اصلی Pandas در ترکیب سادگی و انعطافپذیری آن است. این کتابخانه میتواند فایلهایی با صدها هزار ردیف را پردازش کند، ستونها را بر اساس شرط تغییر دهد و اطلاعات چند منبع را به یکدیگر متصل کند. همچنین با کتابخانههایی مانند NumPy، Matplotlib، Seaborn و ابزارهای یادگیری ماشین سازگاری مناسبی دارد.
- خواندن و نوشتن فایلهای CSV، Excel، JSON و فرمتهای دیگر
- مرتبسازی، فیلتر و انتخاب سطرها و ستونها
- شناسایی و مدیریت دادههای خالی یا تکراری
- گروهبندی اطلاعات و محاسبه شاخصهای آماری
- ادغام چند جدول بر اساس ستونهای مشترک
- کار با تاریخ، زمان و دادههای سری زمانی
- آمادهسازی داده برای مصورسازی و یادگیری ماشین
نصب Pandas و آمادهسازی محیط
پیش از شروع، باید پایتون روی سیستم نصب باشد. برای نصب Pandas میتوانید در ترمینال یا خط فرمان، دستور pip install pandas را اجرا کنید. اگر قصد خواندن و نوشتن فایلهای Excel را دارید، نصب بسته openpyxl نیز ضروری است و با دستور pip install openpyxl انجام میشود.
پس از نصب، کتابخانه را معمولاً با دستور import pandas as pd وارد برنامه میکنیم. عبارت pd یک نام مستعار رایج است که باعث کوتاهتر شدن دستورات میشود. این نام اجباری نیست، اما تقریباً تمام منابع آموزشی و پروژههای حرفهای از همین قرارداد استفاده میکنند.
آشنایی با Series و DataFrame
Pandas دو ساختار داده اصلی به نام Series و DataFrame دارد. درک تفاوت این دو ساختار، استفاده از کتابخانه را بسیار سادهتر میکند.
ساختار Series
Series را میتوان یک ستون برچسبدار در نظر گرفت. برای مثال، مجموعه قیمتهای 120، 180 و 250 را میتوان با دستور pd.Series([120, 180, 250]) به یک Series تبدیل کرد. هر مقدار یک شاخص یا index دارد که در حالت پیشفرض از صفر آغاز میشود. شاخصها میتوانند عدد، متن یا تاریخ باشند.
ساختار DataFrame
DataFrame یک جدول دوبعدی شامل سطر و ستون است و هر ستون آن میتواند نوع داده متفاوتی داشته باشد. برای نمونه، جدولی از محصولات ممکن است شامل نام محصول، دستهبندی، قیمت و تعداد فروش باشد. برای ساخت چنین جدولی میتوان یک دیکشنری پایتون را به pd.DataFrame تحویل داد. کلیدهای دیکشنری به نام ستونها و فهرست مقادیر به دادههای آن ستون تبدیل میشوند.
فرض کنید داده ما شامل ستونهای product با مقادیر لپتاپ و ماوس، ستون price با مقادیر 45000000 و 850000 و ستون quantity با مقادیر 2 و 10 است. پس از ساخت DataFrame، هر ردیف نماینده یک محصول و هر ستون نماینده یک ویژگی خواهد بود.
خواندن داده از فایلهای CSV و Excel
در پروژههای واقعی معمولاً داده را به صورت دستی ایجاد نمیکنیم. اطلاعات از فایل، پایگاه داده یا یک API وارد میشوند. برای خواندن فایل CSV از دستور pd.read_csv استفاده میشود. برای مثال، pd.read_csv با مسیر sales.csv محتوای فایل را به DataFrame تبدیل میکند.
اگر فایل شامل حروف فارسی باشد و هنگام خواندن آن با نویسههای نامفهوم مواجه شوید، باید پارامتر encoding را بررسی کنید. مقدار utf-8 در اغلب موارد مناسب است. برخی فایلهایی که در ویندوز یا نرمافزارهای قدیمی ساخته شدهاند ممکن است به رمزگذاری دیگری نیاز داشته باشند.
برای فایل Excel از pd.read_excel استفاده میشود. پارامتر sheet_name امکان انتخاب برگه مورد نظر را فراهم میکند. همچنین usecols برای خواندن ستونهای مشخص و nrows برای محدود کردن تعداد ردیفها کاربرد دارد. محدود کردن داده هنگام ورود، مصرف حافظه و زمان پردازش را در فایلهای بزرگ کاهش میدهد.
بررسی اولیه مجموعه داده
یکی از اشتباههای رایج این است که تحلیلگر بلافاصله پس از خواندن فایل، محاسبات را آغاز کند. ابتدا باید ساختار داده را بشناسیم. متد head پنج ردیف اول و متد tail پنج ردیف آخر را نمایش میدهد. با دادن یک عدد به این متدها میتوان تعداد ردیفهای خروجی را تغییر داد.
ویژگی shape تعداد سطرها و ستونها را به صورت یک جفت عدد نشان میدهد. ویژگی columns نام ستونها و ویژگی dtypes نوع داده هر ستون را برمیگرداند. متد info نیز خلاصهای از نام ستونها، تعداد مقادیر غیرخالی، نوع داده و میزان تقریبی حافظه مصرفشده ارائه میکند.
برای ستونهای عددی، متد describe شاخصهایی مانند تعداد، میانگین، انحراف معیار، کمینه، بیشینه و چارکها را محاسبه میکند. این اطلاعات میتواند وجود قیمتهای منفی، سنهای غیرمنطقی یا مقادیر بسیار دور از محدوده معمول را آشکار کند.
انتخاب ستونها و سطرها
برای انتخاب یک ستون، نام آن را داخل کروشه قرار میدهیم؛ برای مثال df[price] در کد واقعی با نام ستون به صورت یک رشته نوشته میشود. نتیجه این انتخاب معمولاً یک Series است. اگر چند ستون لازم باشد، فهرستی از نام ستونها را درون کروشه قرار میدهیم تا یک DataFrame جدید ساخته شود.
دو ابزار مهم برای انتخاب دقیق دادهها loc و iloc هستند. loc بر اساس نام سطر و ستون کار میکند، در حالی که iloc موقعیت عددی را در نظر میگیرد. برای مثال، با iloc میتوان سه سطر اول و دو ستون اول را انتخاب کرد. با loc نیز میتوان سطرهایی را انتخاب کرد که شرط مشخصی دارند و فقط ستونهای محصول و قیمت را نمایش داد.
فیلتر کردن بر اساس شرط
فرض کنید میخواهیم محصولاتی با قیمت بیشتر از یک میلیون تومان را پیدا کنیم. ابتدا شرط df[price] > 1000000 ساخته میشود و سپس این شرط داخل کروشه DataFrame قرار میگیرد. برای ترکیب چند شرط باید از عملگر & برای و، عملگر | برای یا و علامت ~ برای نقیض استفاده کرد. هر شرط نیز باید داخل پرانتز قرار گیرد.
متد isin زمانی مفید است که مقدار ستون باید در یک فهرست مشخص باشد. برای نمونه، میتوان فقط سفارشهای مربوط به شهرهای تهران، شیراز و تبریز را انتخاب کرد. متد between نیز بررسی میکند که مقدار عددی در یک بازه قرار دارد یا خیر.
پاکسازی دادهها در Pandas
داده خام معمولاً کامل و یکدست نیست. ممکن است بعضی خانهها خالی باشند، نام شهرها با فاصله اضافی ثبت شده باشد یا یک سفارش چند بار تکرار شده باشد. پاکسازی داده مرحلهای ضروری است، زیرا نتیجه تحلیل به کیفیت ورودی وابسته است.
مدیریت مقادیر خالی
متد isna خانههای خالی را مشخص میکند. ترکیب isna و sum تعداد مقادیر خالی هر ستون را نشان میدهد. پس از شناسایی این موارد باید تصمیم بگیریم که آنها حذف یا جایگزین شوند. متد dropna ردیفها یا ستونهای دارای مقدار خالی را حذف میکند و fillna مقدار جایگزین قرار میدهد.
انتخاب مقدار جایگزین باید منطقی باشد. برای مثال، میتوان قیمت خالی را با میانه قیمت همان دسته محصول جایگزین کرد، اما قرار دادن عدد صفر ممکن است میانگین را به شکل نادرست کاهش دهد. در یک ستون متنی نیز میتوان مقدار خالی را با عبارت «نامشخص» جایگزین کرد تا ردیف حفظ شود.
حذف دادههای تکراری
متد duplicated سطرهای تکراری را شناسایی و drop_duplicates آنها را حذف میکند. گاهی تکراری بودن باید فقط بر اساس یک یا چند ستون تعیین شود. برای مثال، اگر شناسه سفارش یکتا است، بهتر است پارامتر subset روی همین ستون تنظیم شود. پارامتر keep نیز تعیین میکند اولین یا آخرین نمونه باقی بماند.
اصلاح نوع داده و متن
نوع داده نامناسب میتواند عملیات را مختل کند. اگر قیمت به صورت متن وارد شده باشد، جمع و میانگین آن درست انجام نمیشود. متد astype برای تبدیل نوع داده مناسب است، اما در دادههای آلوده ممکن است خطا ایجاد کند. تابع pd.to_numeric با گزینه errors برابر coerce مقادیر غیرقابل تبدیل را به مقدار خالی تبدیل میکند تا بعداً بررسی شوند.
برای پاکسازی متن میتوان از قابلیت str استفاده کرد. متدهای str.strip برای حذف فاصله ابتدا و انتها، str.lower برای تبدیل حروف انگلیسی به حالت کوچک و str.replace برای جایگزینی بخشی از متن کاربرد دارند. یکسانسازی متن پیش از گروهبندی اهمیت زیادی دارد؛ زیرا «تهران» و عبارتی که در انتهای آن فاصله دارد، ممکن است دو گروه جدا تشخیص داده شوند.
ساخت و تغییر ستونها
ساخت ستون محاسباتی یکی از کارهای روزمره در Pandas است. در مثال فروش، مبلغ هر ردیف از ضرب قیمت در تعداد به دست میآید. کافی است حاصل ضرب ستون price در quantity را به ستونی جدید مانند total اختصاص دهیم. عملیات روی کل ستون انجام میشود و نیازی به حلقهنویسی برای تکتک ردیفها نیست.
برای تغییر نام ستونها از rename استفاده میشود. اگر هدف تغییر همه نامها باشد، میتوان فهرست جدیدی به ویژگی columns اختصاص داد. بهتر است در پروژهها از نامهای کوتاه، روشن و یکدست استفاده شود. متد drop نیز برای حذف ستونها یا ردیفهای غیرضروری به کار میرود.
برای ایجاد یک ستون شرطی میتوان از ابزارهایی مانند np.where یا تابع apply استفاده کرد. با این حال، عملیات برداری معمولاً سریعتر از apply است. apply زمانی مناسب است که منطق مورد نظر با توابع استاندارد و عملیات مستقیم ستونی قابل بیان نباشد.
مرتبسازی و گروهبندی دادهها
متد sort_values دادهها را بر اساس یک یا چند ستون مرتب میکند. با تنظیم ascending روی False میتوان ترتیب نزولی داشت. برای مثال، مرتبسازی بر اساس total به صورت نزولی، سفارشهای با بیشترین مبلغ را در ابتدای جدول قرار میدهد.
متد groupby برای تهیه گزارشهای خلاصه استفاده میشود. فرض کنید میخواهیم مجموع فروش هر شهر را محاسبه کنیم. داده را بر اساس ستون city گروهبندی میکنیم، ستون total را انتخاب میکنیم و متد sum را اجرا میکنیم. برای محاسبه همزمان چند شاخص میتوان از agg استفاده کرد؛ مثلاً مجموع مبلغ، میانگین قیمت و تعداد سفارشها را در یک مرحله به دست آورد.
پس از groupby، نام گروه ممکن است به index تبدیل شود. استفاده از reset_index آن را دوباره به یک ستون معمولی تبدیل میکند. گزینه as_index برابر False نیز از ابتدا نتیجهای با ستونهای عادی ایجاد میکند و برای خروجی گرفتن یا ادغامهای بعدی مناسب است.
ادغام چند DataFrame
در بسیاری از پروژهها اطلاعات در چند جدول نگهداری میشود. ممکن است جدول سفارشها فقط شناسه مشتری را داشته باشد و نام و شهر مشتری در جدول دیگری ذخیره شده باشد. تابع merge این دو جدول را بر اساس ستون مشترک به هم متصل میکند.
پارامتر how نوع اتصال را مشخص میکند. اتصال inner فقط ردیفهایی را نگه میدارد که در هر دو جدول کلید مشترک دارند. اتصال left همه ردیفهای جدول سمت چپ را حفظ میکند و در صورت نبود تطابق، ستونهای جدول دوم خالی میمانند. انتخاب نوع اتصال باید بر اساس هدف تحلیل انجام شود؛ برای نمونه، هنگام بررسی تمام سفارشها معمولاً اتصال left انتخاب مناسبتری است.
تابع concat برای قرار دادن چند DataFrame در امتداد سطرها یا ستونها کاربرد دارد. اگر فایل فروش هر ماه جداگانه ذخیره شده باشد و ساختار همه فایلها یکسان باشد، میتوان آنها را با concat به یک جدول سالانه تبدیل کرد.
کار با تاریخ و زمان
تاریخها در فایلهای ورودی ممکن است به صورت متن خوانده شوند. تابع pd.to_datetime آنها را به نوع زمانی تبدیل میکند. پس از تبدیل، میتوان با قابلیت dt سال، ماه، روز یا نام روز هفته را استخراج کرد. این ویژگی برای تحلیل فروش ماهانه، شناسایی روزهای پرترافیک و محاسبه فاصله میان دو رویداد مفید است.
در پروژههایی که تاریخ شمسی دارند باید مشخص شود مقدار ورودی واقعاً در چه تقویمی ذخیره شده است. Pandas به طور پیشفرض با تاریخ میلادی کار میکند. برای تبدیل دقیق تاریخ شمسی میتوان از کتابخانههای تخصصی استفاده کرد و سپس نتیجه استاندارد را برای تحلیل وارد DataFrame کرد.
مثال عملی: تحلیل گزارش فروش
فرض کنید فایل sales.csv شامل ستونهای order_id، product، category، city، price، quantity و order_date است. ابتدا فایل را با read_csv میخوانیم و با head، info و shape ساختار آن را بررسی میکنیم. سپس تعداد مقادیر خالی هر ستون را با isna و sum به دست میآوریم.
در مرحله پاکسازی، فاصلههای اضافی ستونهای product، category و city را حذف میکنیم. ستونهای price و quantity را با pd.to_numeric به عدد تبدیل میکنیم و ردیفهایی را که شناسه سفارش تکراری دارند، بر اساس order_id حذف میکنیم. تاریخ سفارش نیز با pd.to_datetime به نوع زمانی تبدیل میشود.
اکنون ستون total را از ضرب price در quantity میسازیم. اگر هدف محاسبه درآمد واقعی باشد، باید مواردی مانند تخفیف، مالیات، هزینه ارسال و سفارشهای مرجوعی نیز در فرمول لحاظ شوند. این نکته نشان میدهد که یک محاسبه فنی باید با قواعد کسبوکار هماهنگ باشد.
برای یافتن پرفروشترین دستهها، داده را بر اساس category گروهبندی و مجموع total را محاسبه میکنیم. نتیجه را نزولی مرتب میکنیم تا دستههای دارای بیشترین درآمد مشخص شوند. سپس با استخراج ماه از order_date، مجموع فروش هر ماه را به دست میآوریم. گروهبندی بر اساس city نیز بازارهای اصلی را نشان میدهد.
در گام بعد میتوان سفارشهای غیرعادی را بررسی کرد. برای مثال، ردیفهایی با quantity بسیار بالا یا price برابر صفر ممکن است ناشی از خطای ثبت، نمونه رایگان یا فروش عمده باشند. حذف خودکار این دادهها تصمیم مناسبی نیست؛ ابتدا باید دلیل کسبوکاری آنها مشخص شود.
در پایان، گزارش خلاصه را با to_excel در فایل sales_report.xlsx ذخیره میکنیم. اگر چند گزارش مانند فروش شهری، فروش ماهانه و عملکرد دستهها داریم، میتوان با ExcelWriter هر گزارش را در یک برگه جداگانه قرار داد. برای خروجی CSV نیز متد to_csv قابل استفاده است و تنظیم index برابر False از ذخیره شدن شاخص اضافی جلوگیری میکند.
نکات بهینهسازی عملکرد Pandas
Pandas برای دادههای کوچک و متوسط عملکرد مناسبی دارد، اما انتخاب روش درست در مجموعه دادههای بزرگ مهم است. هنگام خواندن فایل، فقط ستونهای مورد نیاز را با usecols وارد کنید. اگر نوع ستونها را میدانید، آنها را با dtype مشخص کنید تا حافظه کمتری مصرف شود.
از حلقههایی مانند for برای پردازش تکتک ردیفها تا حد امکان دوری کنید. عملیات برداری روی ستونها معمولاً سریعتر و خواناتر هستند. دستههای متنی با تعداد مقدار یکتای کم را میتوان به نوع category تبدیل کرد. برای فایلهای بسیار بزرگ نیز پارامتر chunksize امکان پردازش بخشبهبخش را فراهم میکند.
- پس از هر مرحله مهم، تعداد ردیفها و مقادیر خالی را کنترل کنید.
- پیش از تغییر DataFrame اصلی، اثر دستور را روی نمونهای کوچک بررسی کنید.
- از نام ستونهای ثابت و قابل فهم استفاده کنید.
- فرضیات پاکسازی و قواعد حذف داده را مستند کنید.
- برای پروژههای تکراری، مراحل تحلیل را در تابعهای جداگانه قرار دهید.
خطاهای رایج هنگام یادگیری Pandas
یکی از خطاهای متداول، اشتباه گرفتن loc و iloc است. اولی با برچسب و دومی با موقعیت عددی کار میکند. خطای دیگر به تغییر یک نمای موقت از DataFrame مربوط است که ممکن است هشدار SettingWithCopyWarning ایجاد کند. برای جلوگیری از رفتار مبهم، انتخاب را با loc انجام دهید یا با copy یک نسخه مستقل بسازید.
نادیده گرفتن نوع داده نیز مشکلساز است. ستونی که ظاهراً عددی است ممکن است به دلیل وجود جداکننده، واحد پول یا یک مقدار متنی، از نوع object باشد. همچنین نباید نتیجه را بدون بررسی دادههای خالی و تکراری گزارش کرد. عددی که با کد درست محاسبه شده، اگر ورودی نامعتبر باشد همچنان نتیجه قابل اعتمادی نیست.
جمعبندی
Pandas ابزار اصلی بسیاری از فرایندهای تحلیل داده در پایتون است. برای تسلط بر آن باید مسیر کامل کار با داده را تمرین کنید: فایل را بخوانید، ساختار را بررسی کنید، دادههای نامعتبر را پاکسازی کنید، ستونهای محاسباتی بسازید، اطلاعات را فیلتر و گروهبندی کنید و نتیجه را در قالب مناسب خروجی بگیرید.
بهترین روش یادگیری، کار با یک مجموعه داده واقعی است. یک فایل فروش، هزینههای شخصی یا اطلاعات عمومی شهرها را انتخاب کنید و پرسشهای مشخصی مانند بیشترین مقدار، روند ماهانه یا سهم هر گروه را پاسخ دهید. با تکرار این فرایند، دستورات Pandas از مجموعهای از قواعد حفظی به ابزارهایی برای حل مسئله تبدیل میشوند.
