آموزش کتابخانه پانداس (Pandas) در پایتون — رایگان و از صفر تا صد

۲۰۳۶۰ بازدید
آخرین به‌روزرسانی: ۰۹ اسفند ۱۴۰۲
زمان مطالعه: ۱۸ دقیقه
آموزش کتابخانه پانداس (Pandas) در پایتون — رایگان و از صفر تا صد

«پانداس» (Pandas)، یک کتابخانه «متن‌باز» (Open Source) با گواهینامه BSD است که کارایی بالا، ساختاری با قابلیت استفاده آسان و ابزارهای تحلیل داده برای «زبان برنامه‌نویسی پایتون» (Python Programming Language) را فراهم می‌کند. در واقع، می‌توان گفت پانداس یک کتابخانه قدرتمند برای تحلیل، «پیش‌پردازش» (PreProcessing) و «بصری‌سازی» (Visualization) داده‌ها است. گفته می‌شود که کاربران این کتابخانه از سال ۲۰۱۴ تا ۲۰۱۸، از ۵ میلیون به ۱۰ میلیون نفر افزایش پیدا کرده‌اند و اکنون دیگر این کتابخانه به ابزاری که «باید» از آن برای کارهای مربوط به «علم داده» (Data Science) در پایتون استفاده کرد، مبدل شده است. حامی مالی پروژه پانداس، سازمان غیرانتفاعی «NumFOCUS» است.

در مطلب «دیتافریم‌ (DataFrame) در کتابخانه Pandas — راهنمای مقدماتی» به مفهوم دیتافریم که ساختار پایه‌ای داده‌ها در کتابخانه پانداس است و روش کار با آن در پایتون پرداخته شد. در این مطلب، ضمن معرفی کتابخانه پانداس و نسخه‌های گوناگون آن، به بیان مزایای استفاده از این کتابخانه پرداخته شده است. سپس، روش نصب کتابخانه پانداس بیان، ساختارهای داده موجود در آن معرفی و روش وارد کردن (Import) داده‌ها با بهره‌گیری از این کتابخانه، تشریح شده است.

«دانشمندان داده» (Data Scientists) زمان زیادی را صرف پاکسازی و دیگر پیش‌پردازش‌های داده‌ها می‌کنند تا داده‌ها را برای انجام تحلیل‌های گوناگون قابل استفاده کنند. یکی از کتابخانه‌های اصلی پایتون برای آماده‌سازی و پیش‌پردازش داده‌ها، پانداس (Pandas) است. بنابراین در این مطلب، به طور خلاصه چگونگی پیش‌پردازش داده‌ها با بهره‌گیری از پانداس نیز مورد بررسی قرار گرفته است. در نهایت، برخی از توابع و متدهای پایه‌ای برای کار روی دیتافریم‌ها نیز مورد بررسی قرار گرفته‌اند که از این جمله می‌توان به ()value_counts() ،groupby() ،merge() ،describe() ،concat و ()count اشاره کرد. این متدها و توابع، به دسته‌بندی و اکتشاف دیتافریم‌ها در حین فرایند تحلیل کمک شایان توجهی می‌کنند.

نسخه‌های گوناگون کتابخانه پانداس

تاکنون، نسخه‌های گوناگونی از کتابخانه پانداس منتشر شده است که برخی از آن‌ها نسبت به نسخه‌های پیشین خود تغییرات قابل توجهی داشته‌اند و در برخی از آن‌ها تنها چند اشکال جزئی رفع شده است. آخرین نسخه منتشر شده از این کتابخانه، ۰.۲۴ است که در ماه مارس سال ۲۰۱۹ انتشار یافت. در Pandas 0.24، علاوه بر اشکال‌زدایی، تغییراتی در «رابط کاربردی برنامه‌نویسی» (Application Programming Interface) و نوع افزونه‌های آن به وقوع پیوسته است. به طور کلی، این نسخه نسبت به نسخه پیشین خود، بهبودهای قابل توجهی داشته است.

یک پاندا در یک کتابخانه نشسته زیر یک درخت در حال کار با لپ تاپ (تصویر تزئینی مطلب پانداس)

مزایای استفاده از پانداس

در ادامه، برخی از مزایای استفاده از کتابخانه پانداس (Pandas) بیان شده است.

  • این کتابخانه می‌تواند داده‌ها را با بهره‌گیری از ساختارهای Series و DataFrame که ارائه می‌کند، به قالبی که برای تحلیل داده‌ها مناسب هستند، مبدل سازد.
  • بسته پانداس حاوی چندین متد برای پالایش مناسب داده‌ها است.
  • پانداس دارای ابزارهای گوناگونی برای انجام عملیات ورودی/خروجی است و می‌تواند داده‌ها را از فرمت‌های گوناگونی شامل MS Excel ،TSV ،CSV و دیگر موارد بخواند.

نصب Pandas

توزیع استاندارد پایتون با ماژول Pandas ارائه نمی‌شود. برای استفاده از این ماژول شخص ثالث، ابتدا باید آن را نصب کرد.

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

1$ pip install pandas

افرادی که «آناکوندا» (Anaconda) را روی سیستم خود نصب دارند، می‌توانند از دستور زیر برای نصب کتابخانه Pandas استفاده کنند:

1$ conda install pandas

اکیدا توصیه می‌شود که کاربران، آخرین نسخه از این کتابخانه را نصب کنند؛ ولی اگر کسی قصد دارد نسخه قدیمی‌تری از این کتابخانه را نصب کند، باید ورژن مورد نظر خودش را در هنگام نصب دقیقا مشخص کند. نمونه کدی که در آن نسخه ۰.۲۳.۴ نصب شده، در ادامه آمده است.

1$ conda install pandas=0.23.4

ساختار داده‌ها در پانداس

پانداس (Pandas) دارای دو ساختار اصلی برای ذخیره‌سازی داده‌ها است که عبارتند از:

  • Series
  • دیتافریم (DataFrame)

Series در پانداس

یک series مشابه با آرایه یک‌بُعدی است. series می‌تواند داده‌ها از هر نوعی را ذخیره کند. مقادیری که در series قرار می‌گیرند قابل تغییر هستند؛ اما اندازه series پانداس، غیر قابل تغییر است. به اولین عنصر در series، اندیس ۰ تخصیص داده خواهد شد و اندیس آخرین عنصر در series برابر با N-1 است که در آن، N تعداد کل عنصرهای موجود در سری است. برای ساخت Series پانداس، ابتدا باید بسته پانداس را با استفاده از دستور import پایتون، «وارد» (import) کرد.

1import pandas as pd  

برای ساخت Series، متد ()pd.Series فراخوانی می‌شود و یک آرایه، چنانکه در زیر نمایش داده شده، پاس داده می‌شود.

1series1 = pd.Series([1,2,3,4])  

سپس، دستور print برای نمایش دادن محتوای Series مورد استفاده قرار می‌گیرد.

1print(series1)  

خروجی:

0 1 
1 2 
2 3 
3 4 
dtype: int64

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

1import pandas as pd  
2import sys
3
4sys.__stdout__ = sys.stdout
5
6series1 = pd.Series([1,2,3,4])  
7print(series1)

یک Series ممکن است از آرایه «نام‌پای» (numpy) ساخته شود. در ادامه یک آرایه numpy ساخته می‌شود و سپس، این آرایه به Series پانداس «تبدیل» (Convert) می‌شود.

1import pandas as pd  
2import numpy as np  
3import sys
4
5sys.__stdout__ = sys.stdout
6
7fruits = np.array(['apple','orange','mango','pear'])  
8series2 = pd.Series(fruits)  
9print(series2)

خروجی:

0 apple 
1 orange 
2 mango 
3 pear 
dtype: object

کار با وارد کردن کتابخانه‌های لازم، از جمله numpy آغاز شده است. سپس، تابع ()array فراخوانی شده تا یک آرایه از میوه‌ها ساخته شود. پس از آن، از تابع ()Series پانداس استفاده شده و آرایه‌ای که کاربر تمایل دارد آن را به یک series تبدیل کند به آن پاس داده می‌شود. در نهایت، تابع ()print برای نمایش Series مورد استفاده قرار می‌گیرد.

پاندایی در کنار درختی که روی آن آیکون پایتون قرار دارد، نشسته است

دیتافریم

ساختار داده دیتافریم (DataFrame) در پانداس را می‌توان به عنوان یک جدول در نظر گرفت. دیتافریم، داده‌ها را در سطرها و ستون‌ها سازمان‌دهی می‌کند و از آن‌ها یک ساختار داده دوبُعدی می‌سازد. ستون‌ها می‌توانند حاوی مقادیری از انواع گوناگون باشند و در عین حال، اندازه دیتافریم قابل تغییر است؛ بنابراین می‌توان آن را ویرایش کرد. برای ساخت دیتافریم، می‌توان کار را از پایه شروع کرد و یا ساختار داده‌هایی مانند آرایه‌های نام‌پای (Numpy) را به یک دیتافریم مبدل ساخت. در ادامه، کد مربوط به چگونگی ساخت یک DataFrame از پایه، آورده شده است.

1import pandas as pd  
2df = pd.DataFrame({  
3    "Column1": [1, 4, 8, 7, 9],
4    "Column2": ['a', 'column', 'with', 'a', 'string'],
5    "Column3": [1.23, 23.5, 45.6, 32.1234, 89.453],
6    "Column4": [True, False, True, False, True]
7})
8print(df)

خروجی:

 Column1 Column2 Column3 Column4
0 1 a 1.2300 True 
1 4 column 23.5000 False 
2 8 with 45.6000 True 
3 7 a 32.1234 False 
4 9 string 89.4530 True

در مثال بالا، یک دیتافریم با نام df ساخته شده است. ستون اول دیتافریم (DataFrame) حاوی مقادیر صحیح، دومین ستون حاوی یک رشته، ستون سوم حاوی مقادیر «ممیز شناور» (Floating Point) و ستون چهارم حاوی مقادیر «بولی» (Boolean) است. دستور (print(df محتوای دیتافریم را با استفاده از کنسول به کاربر نمایش می‌دهد و این امکان را فراهم می‌کند تا کاربر این محتوا را بررسی و تایید کند. اگرچه، هنگام نمایش دیتافریم، ممکن است کاربر متوجه شود که یک ستون اضافی در آغاز جدول وجود دارد که عناصر آن از ۰ شروع می‌شوند (اندیس‌ها). برای ساخت دیتافریم، باید متد ()pd.DataFrame به صورتی که در مثال بالا نمایش داده شده فراخوانی شود. ساخت یک DataFrame از لیست یا یک مجموعه از لیست‌ها، کاری دشوار است. اکنون فقط باید متد ()pd.DataFrame فراخوانی شود و سپس، متغیر لیست به عنوان تنها آرگومان به آن پاس داده می‌شود. مثال زیر در همین راستا قابل توجه است.

1import pandas as pd  
2mylist = [4, 8, 12, 16, 20]  
3df = pd.DataFrame(mylist)  
4print(df)

خروجی:

 0
0 4 
1 8 
2 12 
3 16 
4 20

در این مثال، لیستی با عنوان mylist با توالی از پنج عدد صحیح ساخته شده است. سپس، متد ()DataFrame فراخوانی شده و نام لیست به عنوان آرگومان به آن پاس داده شده است. این همان جایی است که تبدیل لیست به دیتافریم اتفاق می‌افتد. سپس، محتوای دیتافریم پرینت می‌شود. دیتافریم دارای یک ستون پیش‌فرض است که اندیس‌ها را نمایش می‌دهد و در آن، اندیس اول از صفر شروع می‌شود و اندیس آخر N-1 است و در آن، N تعداد کل عناصر موجود در دیتافریم به حساب می‌آید. مثال دیگری از این مورد، در ادامه آورده شده است.

1import pandas as pd  
2items = [['Phone', 2000], ['TV', 1500], ['Radio', 800]]  
3df = pd.DataFrame(items, columns=['Item', 'Price'], dtype=float)  
4print(df)

خروجی:

 Item Price
0 Phone 2000.0 
1 TV 1500.0 
2 Radio 800.0

در اینجا، لیستی از عناصر با مجموعه‌ای از ۳ عنصر ساخته شده است. برای هر عنصر، یک نام و قیمت وجود دارد. سپس، لیست به متد ()DataFrame پاس داده می‌شود تا آن را به یک شی DataFrame مبدل سازد. در این مثال، نام ستون‌ها برای دیتافریم نیز تعیین شده است. مقادیر عددی نیز به مقادیر ممیز شناور تبدیل می‌شوند زیرا آرگومان dtype از نوع ممیز شناور «float» تعریف شده است. برای دریافت خلاصه داده‌های آیتم‌ها، می‌توان تابع ()describe را روی متغیر دیتافریم که df است فراخوانی کرد.

1df.describe()  

خروجی:

 Price
count 3.000000 
mean 1433.333333 
std 602.771377 
min 800.000000 
25% 1150.000000 
50% 1500.000000 
75% 1750.000000 
max 2000.000000

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

وارد کردن داده‌ها

معمولا، نیاز به استفاده از کتابخانه پانداس برای کار با داده‌هایی است که در یک فایل «اکسل» (Excel) یا CSV ذخیره شده‌اند. این کار نیاز به آن دارد که فایل این داده‌ها باز و داده‌های آن در پانداس وارد (Import) شوند. خوشبختانه، پانداس متدهای زیادی را فراهم می‌کند که می‌توان از آن‌ها برای بارگذاری داده‌ها از چنین منابعی در دیتافریم پانداس استفاده کرد.

وارد کردن داده‌های CSV

یک فایل CSV (این عبارت، سرنامی برای Comma Separated Value است) یک فایل متنی با مقادیری است که به وسیله کاما (,) از یکدیگر جدا شده‌اند. این نوع فایل بسیار شناخته شده و استانداردی است که اغلب مورد استفاده قرار می‌گیرد. از کتابخانه پانداس می‌توان برای خواندن فایل CSV به صورت کامل یا بخش‌هایی از آن، استفاده کرد. برای مثال، یک فایل CSV با نام cars.csv ساخته می‌شود. این فایل باید حاوی داده‌های زیر باشد.

Number,Type,Capacity 
SSD,Premio,1800 
KCN,Fielder,1500 
USG,Benz,2200 
TCH,BMW,2000 
KBQ,Range,3500 
TBD,Premio,1800 
KCP,Benz,2200 
USD,Fielder,1500 
UGB,BMW,2000 
TBG,Range,3200

می‌توان داده‌ها را کپی کرد و در ویرایشگر متنی مانند «نُت‌پد» (Notepad) چسباند؛ سپس، این فایل را با نام cars.csv در همان پوشه‌ای که اسکریپت‌های پایتون ذخیره می‌شوند، ذخیره کرد. پانداس حاوی متدی با عنوان read_csv است که برای خواندن مقادیر CSV در یک دیتافریم پانداس مورد استفاده قرار خواهند گرفت. این متد، مسیر (PATH) به فایل CSV را به صورت آرگومان دریافت می‌کند. کد زیر برای خواند فایل cars.csv مورد استفاده قرار می‌گیرد.

1import pandas as pd  
2data = pd.read_csv('cars.csv')  
3print(data)

خروجی:

 Number Type Capacity
0 SSD Premio 1800 
1 KCN Fielder 1500 
2 USG Benz 2200 
3 TCH BMW 2000 
4 KBQ Range 3500 
5 TBD Premio 1800 
6 KCP Benz 2200 
7 USD Fielder 1500 
8 UGB BMW 2000 
9 TBG Range 3200

در اینجا، فایل CSV در دایرکتوری اسکریپت پایتون ذخیره شده است، بنابراین نام فایل به متد read_csv پاس داده می‌شود و این متد می‌داند که باید پوشه کاری جاری را بررسی کند. اگر فایل در مسیر متفاوتی ذخیره شده است، باید اطمینان حاصل کند که مسیر درستی را به عنوان آرگومان متد پاس داده است. این مسیر می‌تواند مانند cars.csv/.. نسبی و یا مانند Users/nicholas/data/cars.csv/ مطلق باشد.

تصویر تزئینی مطلب پانداس

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

1data.head()  

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

خروجی:

 Number Type Capacity
0 SSD Premio 1800 
1 KCN Fielder 1500 
2 USG Benz 2200 
3 TCH BMW 2000 
4 KBQ Range 3500

متد ()loc ابزار مناسبی است که به کاربر کمک می‌کند تا تنها سطرهای معینی را در مجموعه داده بخواند. این مورد، در مثال زیر نمایش داده شده است.

1import pandas as pd  
2data = pd.read_csv('cars.csv')
3
4print (data.loc[[0, 4, 7], ['Type']])

خروجی:

 Type
0 Premio 
4 Range 
7 Fielder

در اینجا، از متد ()loc برای خواندن عناصر در اندیس ۰، ۴ و ۷ از ستون Type، استفاده شده است. گاهی ممکن است تنها نیاز به خواندن ستون خاصی باشد و دیگر ستون‌ها خوانده نشوند. این کار با استفاده از متد ()loc انجام شده که در مثال زیر نشان داده شده است.

1import pandas as pd  
2data = pd.read_csv('cars.csv')
3
4print (data.loc[:, ['Type', 'Capacity']])

خروجی:

Type Capacity 
0 Premio 1800 
1 Fielder 1500 
2 Benz 2200 
3 BMW 2000 
4 Range 3500 
5 Premio 1800 
6 Benz 2200 
7 Fielder 1500 
8 BMW 2000 
9 Range 3200

در اینجا از متد ()loc برای خواندن همه سطرهای (بخش : ) متعلق به تنها دو ستون از مجموعه داده، یعنی ستون‌های Type و Capacity که در آرگومان تعیین شده‌اند، استفاده شده است.

وارد کردن داده‌های اکسل

علاوه بر متد read_csv، پانداس از تابع read_excel نیز استفاده می‌کند که می‌تواند برای خواندن داده‌های Excel در یک دیتافریم پانداس استفاده شود. در این مثال، از فایل اکسل با نام  workers.xlsx همراه با جزئیات کارگران شرکت استفاده شده است. کد زیر را می‌توان برای بارگذاری محتوای فایل اکسل در یک دیتافریم پانداس استفاده کرد.

1import pandas as pd  
2data = pd.read_excel('workers.xlsx')  
3print (data)

خروجی:

 ID Name Dept Salary
0 1 John ICT 3000 
1 2 Kate Finance 2500 
2 3 Joseph HR 3500 
3 4 George ICT 2500 
4 5 Lucy Legal 3200 
5 6 David Library 2000 
6 7 James HR 2000 
7 8 Alice Security 1500 
8 9 Bosco Kitchen 1000 
9 10 Mike ICT 3300

پس از فراخوانی تابع read_excel، نام فایل به عنوان آرگومان به آن پاس داده می‌شود. read_excel برای باز کردن/بارگذاری فایل و سپس، تجزیه داده‌ها مورد استفاده قرار می‌گیرد. همانطور که از مثال پیشین مشهود است، تابع ()print به کاربر کمک می‌کند تا محتوای دیتافریم را نمایش دهد. همچنین، همانطور که در مثال مروبط به کار با فایل CSV بیان شد، این تابع را می‌توان با متد ()loc ترکیب کرد تا به خواندن سطرها و ستون‌های خاصی از فایل اکسل کمک کند. برای مثال:

1import pandas as pd  
2data = pd.read_excel('workers.xlsx')
3
4print (data.loc[[1,4,7],['Name','Salary']])

خروجی:

Name Salary 
1 Kate 2500 
4 Lucy 3200 
7 Alice 1500

از متد ()loc برای بازیابی مقادیر Name و Salary از عناصر در اندیس‌های ۱، ۴ و ۷ استفاده شده است. همچنین، Pandas این امکان را برای کاربر فراهم می‌کند تا از دو فایل اکسل به طور هم‌زمان بخواند. فرض می‌شود که داده‌های قبلی در Sheet1 هستند و داده‌های دیگری در Sheet2 از همان فایل اکسل قرار دارند. کدی که در ادامه آمده، نشان می‌دهد که چگونه می‌توان از دو شیت به طور هم‌زمان خواند.

1import pandas as pd  
2with pd.ExcelFile('workers.xlsx') as x:  
3    s1 = pd.read_excel(x, 'Sheet1')
4    s2 = pd.read_excel(x, 'Sheet2')
5
6print("Sheet 1:")  
7print (s1)  
8print("")  
9print("Sheet 2:")  
10print (s2)

خروجی:

Sheet 1:  
   ID    Name      Dept  Salary
0   1    John       ICT    3000  
1   2    Kate   Finance    2500  
2   3  Joseph        HR    3500  
3   4  George       ICT    2500  
4   5    Lucy     Legal    3200  
5   6   David   Library    2000  
6   7   James        HR    2000  
7   8   Alice  Security    1500  
8   9   Bosco   Kitchen    1000  
9  10    Mike       ICT    3300

Sheet 2:  
   ID    Name  Age  Retire
0   1    John   55    2023  
1   2    Kate   45    2033  
2   3  Joseph   55    2023  
3   4  George   35    2043  
4   5    Lucy   42    2036  
5   6   David   50    2028  
6   7   James   30    2048  
7   8   Alice   24    2054  
8   9   Bosco   33    2045  
9  10    Mike   35    2043

اتفاقی که در کد بالا می‌افتد آن است که تابع ()read_excel با کلاس پوشش‌دهنده ExcelFile ترکیب شده است. متغیر x هنگامی ساخته شده است که کلاس wrapper با کلیدواژه پایتون with فراخوانی شده است؛ این کلیدواژه برای باز کردن موقتی فایل مورد استفاده قرار می‌گیرد. از ExcelFile متغیر x، دو متغیر دیگر s1 و s2 ساخته شده است تا محتوایی که از Sheet‌های مختلف خوانده می‌شوند، با بهره‌گیری از آن‌ها نمایش داده شوند. سپس، از دستور print برای نمایش محتوای دو «کاربرگ» (sheet) در کنسول استفاده شده است. دستور print خالی، یعنی ٰ("")print، برای چاپ کردن یک خط خالی بین کاربرگ‌ها مورد استفاده قرار می‌گیرد.

پیش‌پردازش داده‌ها

دستکاری/پیش‌پردازش داده‌ها (Data Wrangling)، فرایند پردازش داده‌ها برای آماده‌سازی آن‌ها جهت استفاده در گام بعدی است. به عنوان مثالی از فرایند پیش‌پردازش داده‌ها می‌توان به ادغام کردم (Merging)، گروه‌بندی (Grouping) و الحاق (Concatenation) اشاره کرد. این نوع دستکاری معمولا بدین دلیل در علم داده مورد نیاز است که داده‌ها را به فرمی مبدل کند که برای انجام تحلیل‌ها و کار با الگوریتم‌ها مناسب‌تر هستند.

ادغام

کتابخانه پانداس این امکان را برای کاربر فراهم می‌کند که اشیای دیتافریم را با تابع ()merge به یکدیگر متصل کنند. در ادامه، دو دیتافریم ساخته و روش ادغام کردن آن‌ها با یکدیگر نمایش داده شده است. در ادامه، کد مربوط به دیتافریم df1 آورده شده است.

1import pandas as pd
2
3d = {  
4    'subject_id': ['1', '2', '3', '4', '5'],
5    'student_name': ['John', 'Emily', 'Kate', 'Joseph', 'Dennis']
6}
7df1 = pd.DataFrame(d, columns=['subject_id', 'student_name'])  
8print(df1)

خروجی:

subject_id student_name 
0 1 John 
1 2 Emily 
2 3 Kate 
3 4 Joseph 
4 5 Dennis

کد زیر، مربوط به ساخت دومین دیتافریم، df2، است:

1import pandas as pd
2
3data = {  
4    'subject_id': ['4', '5', '6', '7', '8'],
5    'student_name': ['Brian', 'William', 'Lilian', 'Grace', 'Caleb']
6}
7df2 = pd.DataFrame(data, columns=['subject_id', 'student_name'])  
8print(df2)

خروجی:

subject_id student_name 
0 4 Brian 
1 5 William 
2 6 Lilian 
3 7 Grace 
4 8 Caleb

اکنون، نیاز به ادغام دو دیتافریم یعنی df1 و df2 در امتداد مقادیر  subject_id است. در اینجا، به سادگی تابع ()merge به صورتی که در زیر نشان داده شده فراخوانی می‌شود.

1pd.merge(df1, df2, on='subject_id')  

خروجی:

subject_id student_name_x student_name_y 
0 4 Joseph Brian 
1 5 Dennis William

کاری که merging انجام می‌دهد، آن است که سطرها از هر دو دیتافریم را با مقادیر یکسان برای ستون‌هایی که کاربر برای ادغام استفاده می‌کند، باز می‌گرداند. راهکارهای متعددی برای استفاده از تابع pd.merge وجود دارد که در این مقاله پوشش داده نشده‌اند. از جمله این موارد می‌توان به نوع داده‌های قابل ادغام، چگونگی ادغام آن‌ها، نحوه مرتب‌سازی در صورت نیاز و دیگر موارد اشاره کرد.

دو پاندا در حال بیرون آمدن از دو لپ تاپ

Groupby در پانداس

پانداس به طور متداول برای اکتشاف و سازمان‌دهی حجم زیادی از داده‌های جدولی مورد استفاده قرار می‌گیرد. اغلب اوقات، کاربران برای انجام تحلیل‌های بیشتر نیاز به سازمان‌دهی دیتافریم‌های پانداس در زیرگروه‌های گوناگون پیدا می‌کنند. برای مثال، ممکن است که کاربر داده‌های «تابلوی بورس» (Stock Ticker) را در دیتافریم داشته باشد. دیتافریم پانداس مذکور، احتمالا به صورت زیر خواهد بود.

>>> df
date symbol open high low close volume
0 2019-03-01 AMZN 1655.13 1674.26 1651.00 1671.73 4974877
1 2019-03-04 AMZN 1685.00 1709.43 1674.36 1696.17 6167358
2 2019-03-05 AMZN 1702.95 1707.80 1689.01 1692.43 3681522
3 2019-03-06 AMZN 1695.97 1697.75 1668.28 1668.95 3996001
4 2019-03-07 AMZN 1667.37 1669.75 1620.51 1625.95 4957017
5 2019-03-01 AAPL 174.28 175.15 172.89 174.97 25886167
6 2019-03-04 AAPL 175.69 177.75 173.97 175.85 27436203
7 2019-03-05 AAPL 175.94 176.00 174.54 175.53 19737419
8 2019-03-06 AAPL 174.67 175.49 173.94 174.52 20810384
9 2019-03-07 AAPL 173.87 174.44 172.02 172.50 24796374
10 2019-03-01 GOOG 1124.90 1142.97 1124.75 1140.99 1450316
11 2019-03-04 GOOG 1146.99 1158.28 1130.69 1147.80 1446047
12 2019-03-05 GOOG 1150.06 1169.61 1146.19 1162.03 1443174
13 2019-03-06 GOOG 1162.49 1167.57 1155.49 1157.86 1099289
14 2019-03-07 GOOG 1155.72 1156.76 1134.91 1143.30 1166559

فرض می‌شود که کاربر قصد دارد این اطلاعات سهام را بر مبنای نماد-به-نماد به جای ترکیب داده‌های آمازون (“AMZN”) با گوگل (“GOOG”) یا حتی اپل (“AAPL”)، تحلیل کند. در اینجا است که متد Groupby پانداس مفید واقع می‌شود. می‌توان از Groupby برای تقسیم‌بندی داده‌ها در زیرمجموعه‌ها به منظور انجام تحلیل‌های بعدی استفاده کرد.

کاربردهای پایه‌ای Groupby در پایتون

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

>>> import pandas as pd
>>> import numpy as np
>>> url = 'https://gist.githubusercontent.com/alexdebrie/b3f40efc3dd7664df5a20f5eee85e854/raw/ee3e6feccba2464cbbc2e185fb17961c53d2a7f5/stocks.csv'
>>> df = pd.read_csv(url)
>>> df
date symbol open high low close volume
0 2019-03-01 AMZN 1655.13 1674.26 1651.00 1671.73 4974877
1 2019-03-04 AMZN 1685.00 1709.43 1674.36 1696.17 6167358
2 2019-03-05 AMZN 1702.95 1707.80 1689.01 1692.43 3681522
3 2019-03-06 AMZN 1695.97 1697.75 1668.28 1668.95 3996001
4 2019-03-07 AMZN 1667.37 1669.75 1620.51 1625.95 4957017
5 2019-03-01 AAPL 174.28 175.15 172.89 174.97 25886167
6 2019-03-04 AAPL 175.69 177.75 173.97 175.85 27436203
7 2019-03-05 AAPL 175.94 176.00 174.54 175.53 19737419
8 2019-03-06 AAPL 174.67 175.49 173.94 174.52 20810384
9 2019-03-07 AAPL 173.87 174.44 172.02 172.50 24796374
10 2019-03-01 GOOG 1124.90 1142.97 1124.75 1140.99 1450316
11 2019-03-04 GOOG 1146.99 1158.28 1130.69 1147.80 1446047
12 2019-03-05 GOOG 1150.06 1169.61 1146.19 1162.03 1443174
13 2019-03-06 GOOG 1162.49 1167.57 1155.49 1157.86 1099289
14 2019-03-07 GOOG 1155.72 1156.76 1134.91 1143.30 1166559

در کد بالا، کتابخانه‌های «پانداس» (Pandas) و «نام‌پای» (NumPy) «وارد» (Import) می‌شوند. سپس، یک دیتافریم پایه‌ای با دانلود کردن داده‌های CSV از یک URL، راه‌اندازی شده است. مجموعه داده در کنسول چاپ (Print) می‌شود تا مشاهده شود که چه مواردی در آن موجود هستند. اکنون، باید دیتافریم را بر اساس «نمادهای سهام» گروه‌بندی کرد. ساده‌ترین و متداول‌ترین راهکار برای استفاده از groupby، پاس دادن یک یا تعداد بیشتری نام ستون است. در این مثال، «symbol» به عنوان نام ستون برای گروه‌بندی مورد استفاده قرار می‌گیرد.

1>>> symbols = df.groupby('symbol')
2>>> print(symbols.groups)
3{'AAPL': Int64Index([5, 6, 7, 8, 9], dtype='int64'),
4 'AMZN': Int64Index([0, 1, 2, 3, 4], dtype='int64'),
5 'GOOG': Int64Index([10, 11, 12, 13, 14], dtype='int64')}

درک تفسیر خروجی بر اساس گروه‌های چاپ شده، می‌تواند کمی سخت باشد. در خروجی بالا، می‌توان مشاهده کرد که سه گروه AMZN ،AAPL و GOOG وجود دارند. برای هر گروه، اندیس‌های سطرهای متعلق به هر گروه در دیتافریم اصلی، وجود دارند. ورودی groupby کاملا انعطاف‌پذیر است. کاربر می‌تواند در صورت تمایل، گروه‌بندی را بر اساس چندین ستون انجام دهد. برای مثال، اگر ستون سال وجود داشت، می‌توان از ستون‌های نمادهای سهام و سال برای گروه‌بندی داده‌ها و تحلیل سال به سال سهام هر شرکت استفاده کرد.

استفاده از تابع سفارشی در Groupby پانداس

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

1>>> def increased(idx):
2...     return df.loc[idx].close > df.loc[idx].open
3...
4>>> df.groupby(increased).groups
5{False: Int64Index([2, 3, 4, 7, 8, 9, 13, 14], dtype='int64'),
6 True: Int64Index([0, 1, 5, 6, 10, 11, 12], dtype='int64')}

ابتدا، تابعی تعریف می‌شود که increased نام نهاده شده و اندیس‌ها را دریافت می‌کند. این تابع، اگر «قیمت بسته شدن بورس» (Close Value) برای آن سطر در دیتافریم بالاتر از «قیمت بازگشایی بورس» (Open Value) باشد، مقدار «True» را باز می‌گرداند؛ در غیر این صورت، مقدار «False» را باز می‌گرداند. هنگامی که تابع به متد ()groupby پاس داده شد، دیتافریم بسته به آنکه قیمت تعطیلی بورس بیشتر از قیمت بازگشایی آن در همان روز بوده یا نه، در دو گروه تقسیم‌بندی می‌شود.

عملیات روی گروه‌های پانداس

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

1>>> symbols['volume'].agg(np.mean)
2symbol
3AAPL    23733309.4
4AMZN     4755355.0
5GOOG     1321077.0
6Name: volume, dtype: float64

برای تکمیل این وظیفه، کاربر باید ستون‌هایی که می‌خواهد در آن عملیات انجام دهد (“volume”) را تعیین کند و سپس، از متد agg پانداس برای اعمال تابع میانگین استفاده کند. نتیجه، مقدار میانگین برای هر سه نماد است. بدین شکل، می‌توان مشاهده کرد که حجم معاملات AAPL یک مرتبه بزرگ‌تر از حجم معاملات AMZN و GOOG است.

تکرار و انتخاب گروه‌ها

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

1>>> for symbol, group in symbols:
2...     print(symbol)
3...     print(group)
4...
5AAPL
6         date symbol    open    high     low   close    volume
75  2019-03-01   AAPL  174.28  175.15  172.89  174.97  25886167
86  2019-03-04   AAPL  175.69  177.75  173.97  175.85  27436203
97  2019-03-05   AAPL  175.94  176.00  174.54  175.53  19737419
108  2019-03-06   AAPL  174.67  175.49  173.94  174.52  20810384
119  2019-03-07   AAPL  173.87  174.44  172.02  172.50  24796374
12AMZN
13         date symbol     open     high      low    close   volume
140  2019-03-01   AMZN  1655.13  1674.26  1651.00  1671.73  4974877
151  2019-03-04   AMZN  1685.00  1709.43  1674.36  1696.17  6167358
162  2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43  3681522
173  2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95  3996001
184  2019-03-07   AMZN  1667.37  1669.75  1620.51  1625.95  4957017
19GOOG
20          date symbol     open     high      low    close   volume
2110  2019-03-01   GOOG  1124.90  1142.97  1124.75  1140.99  1450316
2211  2019-03-04   GOOG  1146.99  1158.28  1130.69  1147.80  1446047
2312  2019-03-05   GOOG  1150.06  1169.61  1146.19  1162.03  1443174
2413  2019-03-06   GOOG  1162.49  1167.57  1155.49  1157.86  1099289
2514  2019-03-07   GOOG  1155.72  1156.76  1134.91  1143.30  1166559

هر تکرار در شی groupby دو مقدار را باز می‌گرداند. اولین مقدار شناساگر گروه است که در واقع، مقدار ستون(هایی) است که گروه‌بندی شده‌اند. دومین مقدار خود گروه است که یک شی دیتافریم محسوب می‌شود.

متد get_group در پانداس

اگر کاربر انعطاف‌پذیری بسیاری برای دستکاری یک گروه مجرد نیاز دارد، می‌تواند از متد get_group برای بازیابی یک گروه مجرد استفاده کند.

1>>> aapl = symbols.get_group('AAPL')
2>>> aapl
3         date symbol    open    high     low   close    volume
45  2019-03-01   AAPL  174.28  175.15  172.89  174.97  25886167
56  2019-03-04   AAPL  175.69  177.75  173.97  175.85  27436203
67  2019-03-05   AAPL  175.94  176.00  174.54  175.53  19737419
78  2019-03-06   AAPL  174.67  175.49  173.94  174.52  20810384
89  2019-03-07   AAPL  173.87  174.44  172.02  172.50  24796374
9>>> type(aapl)
10<class 'pandas.core.frame.DataFrame'>

در مثال بالا، باید از متد get_group برای بازیابی همه سطرهای AAPL استفاده شود. برای بازیابی یک گروه مشخص، شناساگر گروه به متد get_group پاس داده می‌شود. این متد، یک دیتافریم Pandas باز می‌گرداند که می‌تواند در صورت نیاز توسط کاربر دستکاری شود.

آیکون پایتون روی سر پاندا

درک شکل داده‌ها با Count و value_counts در پانداس

در صورتی که کاربر با یک دیتافریم بزرگ کار می‌کند، نیاز به استفاده از اکتشافات گوناگون برای درک شکل داده‌ها دارد. در این بخش، دو متد count و value_counts پانداس برای ارزیابی دیتافریم مورد استفاده قرار خواهند گرفت. متد count تعداد مقادیر در هر ستون از DataFrame را نشان می‌دهد. با استفاده از دیتافریم بالا، خروجی زیر حاصل می‌شود.

>>> df.count()
date 15
symbol 15
open 15
high 15
low 15
close 15
volume 15
dtype: int64

خروجی برای کاربر مفید نیست، زیرا هر یک از ۱۵ سطر دارای یک مقدار برای هر ستون هستند. اگرچه، این کار در صورتی می‌تواند مفید باشد که مجموعه داده تعداد بیشتری از مقادیر را از دست بدهد. با استفاده از متد count می‌توان به شناسایی ستون‌هایی که غیر کامل هستند کمک کرد. از آنجا، می‌توان تصمیم گرفت که یک ستون دارای مقادیر ناموجود را از پردازش‌ها حذف کرد یا مقادیری برای مقادیر ناموجود یافت و جایگزین کرد.

متد value_counts در پایتون

در این مثال، value_counts مفیدتر است. این متد تعداد مقادیر یکتا را برای یک ستون خاص باز می‌گرداند. اگر کاربر، مقادیر پیوسته دارد (مانند ستون‌های دیتافریم بالا)، می‌تواند از آرگومان اختیاری bins برای جداسازی مقادیر در bins نیمه باز استفاده کند. اکنون، می‌توان از متد  value_counts پانداس برای نمایش شکل ستون volume استفاده کرد.

1>>> df['volume'].value_counts(bins=4)
2(1072952.085, 7683517.5]    10
3(20851974.5, 27436203.0]     3
4(14267746.0, 20851974.5]     2
5(7683517.5, 14267746.0]      0
6Name: volume, dtype: int64

در خروجی بالا، پانداس (Pandas) چهار bins (دسته) جدا برای ستون حجم (volume) ساخته است و تعداد سطرهایی که در هر bin قرار دارند را نشان می‌دهد. ()counts و ()value_counts ابزارهای مناسبی برای درک سریع شکل داده‌ها هستند.

الحاق

«الحاق» (Concatenation) داده‌ها، که در واقع به معنای افزودن یک مجموعه از داده‌ها به دیگری است، به وسیله فراخوانی تابع ()concat قابل انجام است. در ادامه، چگونگی الحاق مجموعه داده‌ها با استفاده از دو دیتافریم پیشین که در بالا معرفی شدند یعنی df1 و df2، هر یک با دو ستون subject_id و student_name، بیان شده است.

1print(pd.concat([df1, df2]))  

خروجی:

1subject_id student_name  
20          1         John  
31          2        Emily  
42          3         Kate  
53          4       Joseph  
64          5       Dennis  
70          4        Brian  
81          5      William  
92          6       Lilian  
103          7        Grace  
114          8        Caleb

آمار توصیفی

چنانکه پیش‌تر نشان داده شد، با استفاده از تابع ()describe، آمار توصیفی برای ستون‌های عددی ارائه می‌شود، اما ستون‌های حاوی کاراکتر توسط این تابع در نظر گرفته نمی‌شوند. در ادامه، ابتدا یک دیتافریم ساخته می‌شود که در آن، اسامی دانش‌آموزان و رتبه آن‌ها در ریاضیات (Math) و انگلیسی (English) نمایش داده شده است.

1import pandas as pd
2
3data = {  
4    'Name': ['John', 'Alice', 'Joseph', 'Alex'],
5    'English': [64, 78, 68, 58],
6    'Maths': [76, 54, 72, 64]
7}
8
9df = pd.DataFrame(data)  
10print(df)

خروجی:

 English Maths Name
0 64 76 John 
1 78 54 Alice 
2 68 72 Joseph 
3 58 64 Alex

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

1df.describe()  

خروجی:

 English Maths
count 4.000000 4.000000 
mean 67.000000 66.500000 
std 8.406347 9.712535 
min 58.000000 54.000000 
25% 62.500000 61.500000 
50% 66.000000 68.000000 
75% 70.500000 73.000000 
max 78.000000 76.000000

همانطور که مشهود است، متد ()describe به طور کامل ستون Name را نادیده گرفت است، زیرا مقادیر آن عددی نیستند. این کار به کاربر کمک می‌کند تا بدون داشتن دغدغه حذف ستون‌های حاوی مقادیر غیر عددی به منظور دریافت آمارهای مربوط به مقادیر عددی، بتواند با داده‌ها کار کند.

نتیجه‌گیری

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

بر اساس رای ۵۷ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
pydatakitedataschoolstackabuse
۱۳ دیدگاه برای «آموزش کتابخانه پانداس (Pandas) در پایتون — رایگان و از صفر تا صد»

نمونه همین کد رو تو این مقاله که وارد میکنم موقع کدنویسی هیچ مشکلی نیست. تمام کلاس های پاندا رو تو vscode میاره. ولی موقع اجرا با ارور ModuleNotFoundError: No module named ‘pandas’ مواجه میشم.


با سلام و احترام؛

صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

کتابخانه pandas از طریق pip به عنوان یک wheel توزیع شده است، که این یعنی لازم است wheel را هم نصب کنید.

pip install wheel
pip install pandas

برای شما آرزوی سلامتی و موفقیت داریم.

در ضمن من مراحل نصب پاندا رو انجام دادم. فقط هم یک ورژن پایتون نصب دارم پایتون3.
واقعا ممنون میشم کمکم کنید

سلام وقت بخیر ممنون بابت اطلاعات مفیدتون. من یه سوالی داشتم.
من یک فایل اکسل رو با پانداس فراخوان کردم و میخوام که ستون اول رو بر حسب ستون دوم پلات کنم اما نمیشه و هرکدوم از ستون ها جدا پلات میشن توی یک نمودار، ممنون میشم راهنمایی کنید.
باید این ها رو که از نوع کلاس هستند بیرون بکشم؟

سلام مطالبتون خیلی مفید بود
من میخوام یه لیبل اختصاص بدن به یه سلول در اکسل چه کدی باید بنویسم
مثلا داخل پایتون داخل لیبل عدد وترد کردن بره تو اکسل ذخیره بشه ؟

سلام.سوالی داشتم از خدمت تون.
من دو دسته سری زمانی دارم. میدونم توی یکی از این دسته ها در مقایسه با اون یکی بعضی از زمان های خاص دیتا ندارم… میخوام با مقایسه این دوتا دیتا بفهمم کدوم زمان ها دیتام گم شده. چطور میتونم این کار رو بکنم؟

سلام .من یه سری دیتا دارم میخام اونها رو بر اساس درصد تقسیم کنم یعنی مثلاً ۷۰درصد داده ها به طور شانسی یه جا و ۳۰درصدش جدا از او تقسیم بشن .چه کدی بنویسم؟؟

عالی بود ممنونم

با سلام. خیلی مفید بود.

اگر بخوایم 20 تا ستون رو گروه بندی کنیم باید چه کنیم ؟

ناسودبر :))))
دوست دارین کلماتی استفاده کنین که مخاطب رو اذیت کنین ؟

با سلام؛

از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم. عبارت «سازمان ناسودبر» معادل دقیق، صحیح و فارسی عبارت «Non-Profit Organization» است. هرچند که از معادل غیرانتفاعی نیز برای این عبارت استفاده می‌شود، ولی با توجه به آنکه عبارت غیرانتفاعی در کشور برای اشاره به برخی از نهادهای سودبر نیز (به اشتباه) استفاده می‌شود، به نظر می‌رسد استفاده از این معادل گمراه کننده باشد. در عین حال، در سال‌های اخیر استفاده از واژه ناسودبر بسیار مرسوم و متداول شده و برای اشاره به سازمان‌های مردم‌نهاد با خصوصیت Non-Profit نیز از این عبارت استفاده می‌شود. ولیکن به منظور سادگی درک عمومی متن، واژه «غیرانتفاعی» جایگزین «ناسودبر» شد.

پیروز، شاد و تندرست شد.

تشکر ویژه بابت آماده کردن این متن حرفه ای

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *