FA-TOOLS — Header Component

آموزش pivot_table در pandas — آنالیز حرفه‌ای داده

رفیق برنامه‌نویس، می‌دونی چقدر تحلیل داده می‌تونه توی کارات سرعت بده؟ اگه دنبال ابزارهای خفن برای آنالیز عمیق داده‌هات هستی، جای درستی اومدی! ما کلی ابزار و اسنیپت‌های پایتونی کاربردی داریم که کارتو راحت‌تر می‌کنه. قبل از شروع آموزش جذاب `pivot_table`، یه سر به فروشگاه ابزارهای ما بزن تا ببینی چقدر می‌تونیم بهت کمک کنیم!

برای هر گونه سوال یا همکاری با ما تماس بگیر: 09202232789

🚀 نقشه راه: `pivot_table` در یک نگاه

آموزش pivot_table در pandas — آنالیز حرفه‌ای داده — تصویر 1
گام اصلی شرح مختصر
۱. مقدمه و نصب آشنایی با `pivot_table` و نصب پانداس.
۲. درک پایه‌ای آشنایی با پارامترهای اصلی: `index`, `columns`, `values`, `aggfunc`.
۳. مثال عملی یک سناریوی واقعی برای تحلیل فروش.
۴. پارامترهای پیشرفته استفاده از `fill_value`, `margins`, `dropna`.
۵. توابع تجمیع سفارشی خلق توابع تجمیع دلخواه برای نیازهای خاص.
۶. MultiIndex و MultiColumn کار با شاخص‌ها و ستون‌های چندسطحی.
۷. عیب‌یابی و نکات تکمیلی حل مشکلات رایج و بهترین روش‌ها.

مقدمه‌ای بر `pivot_table`: عصای جادویی تحلیل داده

تحلیل داده، این روزها جزو مهارت‌هاییه که اگه بلد نباشی، حس می‌کنی یه چیزی کمه. خصوصاً اگه با داده‌های حجیم سروکار داری و می‌خوای از دل اون‌ها الگوها و insightsهای پنهان رو بیرون بکشی. اینجا ابزارهایی مثل پانداس (Pandas) با تابع `pivot_table` وارد عمل میشن. فکر کن یه عالمه داده فروش داری و می‌خوای بدونی هر محصول، توی هر شهر، چقدر فروش داشته. یا مثلاً می‌خوای ببینی میانگین امتیاز مشتریان برای هر سرویس چقدره. تابع `pivot_table` دقیقاً برای همین کارها طراحی شده؛ برای خلاصه کردن، تجمیع و بازآرایی داده‌ها به شکلی که بتونی با یک نگاه، اطلاعات باارزش رو ازشون استخراج کنی.

اگر تا حالا با پانداس کار نکردی، پیشنهاد می‌کنم اول یه نگاهی به مفاهیم اولیه پایوتن (Python) و دیتاساینس بندازی. برای نصب پانداس هم کافیه دستور زیر رو توی ترمینال بزنی:

pip install pandas openpyxl

ما `openpyxl` رو هم نصب می‌کنیم چون ممکنه بخوایم با فایل‌های Excel کار کنیم. حالا بریم سراغ هسته اصلی ماجرا.

درک پارامترهای اصلی `pivot_table`: قلب تپنده آنالیز

تابع `pivot_table` چند تا پارامتر اصلی داره که باهاشون می‌تونی دیتای خام رو به یه جدول معنی‌دار تبدیل کنی. بیا تک‌تک بررسی‌شون کنیم:

index: محور سطرها

این پارامتر مشخص می‌کنه که چه ستونی (یا ستون‌هایی) از دیتای اصلی باید به عنوان شاخص (index) سطرها در جدول نهایی استفاده بشه. هر مقدار یکتا در این ستون، به یک سطر مجزا تبدیل میشه. می‌تونی یک لیست از نام ستون‌ها رو هم بهش بدی تا ایندکس چندسطحی بسازی.

df.pivot_table(index='نام_شهر')

columns: محور ستون‌ها

اینجا مشخص می‌کنی که چه ستونی (یا ستون‌هایی) باید به عنوان سربرگ ستون‌ها در جدول نهایی قرار بگیره. هر مقدار یکتا در این ستون، به یک ستون مجزا تبدیل میشه. اینم مثل index می‌تونه چندسطحی باشه.

df.pivot_table(index='نام_شهر', columns='نوع_محصول')

values: مقادیر تجمیع‌شده

این پارامتر مهم‌ترین بخش داستانه. مشخص می‌کنه که چه ستونی (یا ستون‌هایی) از دیتای اصلی باید مورد تجمیع (aggregation) قرار بگیره و مقادیر داخل خانه‌های جدول نهایی رو تشکیل بده. مثلاً اگه می‌خوای جمع فروش رو ببینی، ستون ‘مبلغ_فروش’ رو اینجا می‌ذاری.

df.pivot_table(index='نام_شهر', columns='نوع_محصول', values='مبلغ_فروش')

aggfunc: تابع تجمیع

این پارامتر مشخص می‌کنه که داده‌های values چطور باید تجمیع بشن. پیش‌فرضش 'mean' (میانگین) هستش، اما می‌تونی توابع زیادی مثل 'sum' (جمع)، 'count' (تعداد)، 'min'، 'max'، 'median'، np.std (انحراف معیار) و حتی یک لیست از این توابع رو بهش بدی.

df.pivot_table(index='نام_شهر', columns='نوع_محصول', values='مبلغ_فروش', aggfunc='sum')

مثال عملی: تحلیل فروش یک شرکت فرضی

بیا با یک مثال واقعی شروع کنیم. فرض کن دیتای فروش یه شرکت رو داریم که شامل ستون‌های تاریخ، منطقه، محصول، مقدار_فروش و درآمد هستش.


import pandas as pd
import numpy as np

# ساخت یک DataFrame نمونه
data = {
    'تاریخ': pd.to_datetime(['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', 
                             '2023-01-03', '2023-01-03', '2023-01-01', '2023-01-02', 
                             '2023-01-03', '2023-01-04']),
    'منطقه': ['شمال', 'جنوب', 'شمال', 'شرق', 'غرب', 'شمال', 'جنوب', 'غرب', 'شرق', 'شمال'],
    'محصول': ['A', 'B', 'A', 'C', 'B', 'A', 'A', 'C', 'B', 'D'],
    'مقدار_فروش': [10, 15, 12, 8, 20, 11, 14, 9, 18, 25],
    'درآمد': [100, 225, 180, 160, 300, 165, 210, 135, 270, 375]
}
df = pd.DataFrame(data)
print("DataFrame اصلی:")
print(df)
    

سناریو ۱: کل فروش بر اساس منطقه و محصول

فرض کن می‌خوایم مجموع درآمد رو برای هر منطقه و هر محصول بدست بیاریم. اینجا منطقه رو می‌ذاریم توی index و محصول رو توی columns و درآمد رو برای values و aggfunc رو روی sum تنظیم می‌کنیم.


# مجموع درآمد بر اساس منطقه و محصول
pivot_df_1 = df.pivot_table(index='منطقه', columns='محصول', values='درآمد', aggfunc='sum')
print("nPivot Table 1 (مجموع درآمد):")
print(pivot_df_1)
    

نتیجه یه جدول خوانا نشون میده که هر منطقه، چقدر از هر محصول درآمد داشته. جاهایی که NaN می‌بینی، یعنی اون محصول توی اون منطقه فروش نداشته.

سناریو ۲: میانگین مقدار فروش بر اساس منطقه و تاریخ

حالا فرض کن می‌خوایم میانگین مقدار_فروش رو بر اساس منطقه در هر تاریخ ببینیم.


# میانگین مقدار فروش بر اساس منطقه و تاریخ
pivot_df_2 = df.pivot_table(index='منطقه', columns='تاریخ', values='مقدار_فروش', aggfunc='mean')
print("nPivot Table 2 (میانگین مقدار فروش):")
print(pivot_df_2)
    

پارامترهای پیشرفته: قدرت بیشتر برای آنالیز

pivot_table فقط به همین چهار تا پارامتر محدود نمیشه. یه سری پارامتر دیگه هم داره که می‌تونه تحلیل‌هاتو خیلی کامل‌تر و دقیق‌تر کنه.

fill_value: پر کردن NaNها

اگه نمی‌خوای خانه‌های خالی (NaN) توی جدول نهایی داشته باشی، می‌تونی از fill_value استفاده کنی. این پارامتر مقداری رو برای جایگزینی NaNها تعیین می‌کنه. مثلاً می‌تونی 0 (صفر) بذاری تا تحلیل‌های بعدی راحت‌تر باشه.


pivot_df_3 = df.pivot_table(index='منطقه', columns='محصول', values='درآمد', aggfunc='sum', fill_value=0)
print("nPivot Table 3 (fill_value=0):")
print(pivot_df_3)
        

margins و margins_name: جمع کل

اگه می‌خوای جمع کل سطرها و ستون‌ها رو هم توی جدولت ببینی، margins=True رو تنظیم کن. margins_name هم بهت اجازه میده اسم ستون یا سطر جمع کل رو تغییر بدی.


pivot_df_4 = df.pivot_table(index='منطقه', columns='محصول', values='درآمد', aggfunc='sum', fill_value=0, margins=True, margins_name='جمع_کل')
print("nPivot Table 4 (با جمع کل):")
print(pivot_df_4)
        

توابع تجمیع سفارشی: وقتی نیازهای خاص داری

گاهی اوقات توابع تجمیع پیش‌فرض مثل sum یا mean کافی نیستن و نیاز داری که یک تابع خاص خودت رو بنویسی. خبر خوب اینه که pivot_table از توابع سفارشی هم پشتیبانی می‌کنه.

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


# تابع سفارشی برای محاسبه درصد فروش
def percentage(series):
    return (series.count() / df['محصول'].count()) * 100

pivot_df_5 = df.pivot_table(index='منطقه', columns='محصول', values='مقدار_فروش', aggfunc=percentage, fill_value=0)
print("nPivot Table 5 (درصد مقدار_فروش با تابع سفارشی):")
print(pivot_df_5)
    

با این روش، دستت برای هر نوع تحلیل دلخواهی بازه. می‌تونی از توابع lambda یا هر تابع دیگه پایتونی که خودت می‌نویسی، استفاده کنی.

MultiIndex و MultiColumn: وقتی داده‌ها پیچیده می‌شوند

گاهی وقتا نیاز داری که جدول پيوت‌ت چند تا ایندکس در سطرها یا چند تا ستون در سربرگ داشته باشه. پانداس این امکان رو به راحتی فراهم می‌کنه. فقط کافیه به پارامترهای index یا columns یک لیست از نام ستون‌ها رو بدی.

مثال: درآمد کل بر اساس منطقه، محصول و تاریخ

فرض کن می‌خوایم مجموع درآمد رو بر اساس منطقه و محصول در هر تاریخ ببینیم. اینجا منطقه و محصول رو به عنوان index و تاریخ رو به عنوان columns قرار میدیم:


# MultiIndex در سطرها
pivot_df_6 = df.pivot_table(index=['منطقه', 'محصول'], columns='تاریخ', values='درآمد', aggfunc='sum', fill_value=0)
print("nPivot Table 6 (MultiIndex در سطرها):")
print(pivot_df_6)
    

همونطور که می‌بینی، سطرها به صورت سلسله‌مراتبی نمایش داده میشن که آنالیز رو برای سناریوهای پیچیده، خیلی راحت‌تر می‌کنه. می‌تونی همین کار رو برای ستون‌ها هم انجام بدی.


# MultiColumn در ستون‌ها
pivot_df_7 = df.pivot_table(index='تاریخ', columns=['منطقه', 'محصول'], values='درآمد', aggfunc='sum', fill_value=0)
print("nPivot Table 7 (MultiColumn در ستون‌ها):")
print(pivot_df_7)
    

عیب‌یابی سریع و نکات تکمیلی

حتی بهترین ابزارها هم می‌تونن گاهی اوقات مشکلاتی داشته باشن. اینجا چندتا مشکل رایج و راه‌حل‌هاشون رو می‌گیم:

مشکل رایج راه‌حل
KeyError: ستون پیدا نمی‌شود. مطمئن شو که نام ستون‌ها رو دقیق و بدون غلط املایی وارد کردی. از df.columns برای بررسی نام‌های واقعی ستون‌ها استفاده کن.
TypeError: Cannot aggregate non-numeric type این یعنی داری روی یه ستون متنی (string) تابع تجمیع عددی (مثل sum یا mean) اعمال می‌کنی. باید ستون values رو از نوع عددی انتخاب کنی یا قبلش تبدیلش کنی (مثلاً با pd.to_numeric()).
NaNهای زیاد در خروجی این طبیعیه، چون برای ترکیب‌های خاصی از ایندکس و ستون، داده‌ای وجود نداشته. می‌تونی از fill_value برای پر کردن این خانه‌ها استفاده کنی.
توابع aggfunc سفارشی کار نمی‌کنند. تابع سفارشی باید یک سری پانداس رو به عنوان ورودی بگیره و یک مقدار اسکالر (تک‌مقدار) رو برگردونه. مطمئن شو که تابعت این قاعده رو رعایت می‌کنه.

نکات مهم برای استفاده بهینه:

  • پاک‌سازی داده (Data Cleaning): قبل از استفاده از pivot_table، حتماً داده‌هاتو تمیز کن. مقادیر گم‌شده (missing values) رو مدیریت کن، خطاهای تایپی رو برطرف کن و مطمئن شو که انواع داده‌ها (Data Types) صحیح هستن.
  • ترکیب با سایر عملیات پانداس: pivot_table رو می‌تونی با توابعی مثل groupby()، apply() و merge() ترکیب کنی تا تحلیل‌های پیچیده‌تری انجام بدی. برای مثال، بعد از ساخت pivot table می‌تونی روش فیلتر اعمال کنی یا ستون‌های جدید بسازی.
  • تجسم‌سازی (Visualization): داده‌های جدول پیوت شده برای رسم نمودارهای میله‌ای، هیستوگرام‌ها و نقشه‌های حرارتی (heatmaps) عالی هستن. بعد از ایجاد جدول، می‌تونی از کتابخانه‌هایی مثل Matplotlib یا Seaborn برای تجسم‌سازی استفاده کنی. یه سری اسنیپت‌های جالب برای تجسم داده می‌تونی پیدا کنی.
  • عملکرد (Performance): برای دیتافریم‌های خیلی بزرگ، pivot_table می‌تونه کمی زمان‌بر باشه. اگه با دیتای حجیم سروکار داری، به بهینه‌سازی کدهای پایوتن و مدیریت حافظه هم فکر کن.

پرسش‌های متداول (FAQ)

فرق pivot_table با groupby چیه؟

دوست من، groupby() یک ابزار قدرتمنده که داده‌ها رو بر اساس یک یا چند ستون گروه‌بندی می‌کنه و بعد عملیات تجمیع رو روی هر گروه انجام میده. pivot_table() هم در واقع یک نوع خاص و تخصصی‌تر از groupby() هست که نتایج رو به شکل یک جدول دوبعدی با ستون‌ها و ایندکس‌های مشخص نمایش میده. برای ساختاردهی گزارش‌ها و آنالیزهای دوبعدی، pivot_table خوانایی بالاتری داره، اما groupby انعطاف‌پذیری بیشتری برای عملیات تجمیع پیچیده‌تر و خروجی‌های غیرجدولی میده.

آیا می‌تونم چندین تابع تجمیع رو همزمان استفاده کنم؟

بله، قطعاً! می‌تونی یک لیست از توابع تجمیع رو به پارامتر aggfunc بدی. مثلاً aggfunc=['sum', 'mean', 'count']. اینجوری جدول پيوت‌ت برای هر سلول، نتایج چند تابع تجمیع رو نشون میده که فوق‌العاده کاربردیه.

چطور می‌تونم خروجی pivot_table رو به Excel یا CSV ذخیره کنم؟

خیلی راحت! کافیه از توابع to_excel() یا to_csv() استفاده کنی. مثلاً:


pivot_df_final.to_excel('analysis_report.xlsx')
pivot_df_final.to_csv('analysis_report.csv', encoding='utf-8-sig') # برای پشتیبانی از حروف فارسی
        

اینجوری می‌تونی نتایج تحلیل‌هات رو با بقیه به اشتراک بذاری یا توی ابزارهای دیگه استفاده کنی.

کلام آخر

pivot_table در پانداس یکی از قدرتمندترین و کاربردی‌ترین توابع برای تحلیل داده‌های ساختاریافته است. با یادگیری و تسلط بر این تابع، می‌تونی به سرعت از داده‌های خام، اطلاعات باارزش و قابل استفاده استخراج کنی و به تصمیم‌گیری‌های بهتر کمک کنی. امیدوارم این آموزش جامع به دردت خورده باشه و بتونی ازش توی پروژه‌هات نهایت استفاده رو ببری.

ابزارهای بیشتر برای برنامه‌نویسان!

برای دسترسی به مجموعه‌ای از کدهای پایتون آماده، اسنیپت‌های CSS، اسکریپت‌های JavaScript، قالب‌های HTML، و راهکارهای وردپرس، حتماً از بخش اسنیپت‌های ما دیدن کن. کلی ابزار کاربردی منتظرته!

تماس با ما: 09202232789

Table of Contents

آخرین نوشته‌ها