Groupby در پانداس چیست
Groupby در پانداس چیست؟
«پانداس»Pandas کتابخانهای با کاربرد و عملکرد بسیار بالاست که متنباز بوده و بر اساس گواهینامه BSD تنظیم شده است. این کتابخانه ساختاری دارد که امکان بهرهگیری از ابزارهای تجزیه و تحلیل برای پایتون را به آسانی امکان پذیر مینماید.
در این مقاله قرار است به ارائه توضیحاتی در رابطه با پانداس بپردازیم که کتابخانهای با ابزارهای قدرتمند برای تجزیه و تحلیل پیش پردازشها را دارا میباشد.
با استفاده از پانداس میتوان بسیاری از اعمال مرتبط با Data Science را در پایتون به انجام رسانید. از طرفی توابع و متدهای پایهای که برای کار روی دیتا فریمهای این کتابخانه مورد استفاده قرار میگیرند، مثل Groupby در پانداس که در ادامه برایتان شرح داده خواهد شد.
ساختار داده دیتافریم
دیتا فریم یک ساختار پایه مربوط به داده هاست که در کتابخانه پانداس از آن استفاده میشود و توضیحات لازم برای کار با آن در پایتون نیز توضیح داده خواهد شد. در این قسمت علاوه بر معرفی و ارائه توضیحاتی در رابطه با کتابخانه پانداس مزایای استفاده از آن را نیز بیان میکنیم و نسخههای گوناگون آن را برایتان شرح میدهیم.
حتی نحوه نصب این کتابخانه و چگونگی ساختارهای دادهای موجود در آن برای ایمپورت کردن دادهها در این کتابخانه توضیح داده خواهد شد. دانشمندان داده برای آنکه بتوانند دادهها را قابل استفاده کرده و از آنها در تحلیل های مختلف استفاده کنند زمان زیادی را برای پیش پردازش دادهها و همچنین پاکسازی آنها مصرف مینمایند.
پانداس نیز یکی از کتابخانههای مهم و اصلی پایتون است که برای پیش پردازش و آماده سازی دادهها کاربردی و مناسب میباشد، به همین خاطر در ادامه مقاله مطالبی در رابطه با نحوه پیش پردازش دادهها با پانداس را نیز برایتان توضیح خواهیم داد و همانطور که گفته شد برخی از توابع و متدهای پایه برای انجام عملیات روی دیتا فریمها مورد بررسی قرار میگیرند.
مثل Groupby در پانداس ، value_counts() ،merge() ،describe() ،concat و ()count که همگی روشی برای آسان شدن دسته بندیها در هنگام انجام فرایند تحلیل محسوب میشوند.
نسخههای گوناگون کتابخانه پانداس
پانداس کتابخانهای است که تا به امروز نسخه های مختلفی از آن به انتشار رسیده و در برخی از این آپدیتها تغییرات مهم و اساسی به وجود آمده است اما برخی از آنها نیز تنها به برطرف کردن باگها و مشکلات جزئی نسخه قبلی پرداختهاند.
نسخه ۰.۲۴ آخرین ورژنی است که در ماه مارس سال ۲۰۱۹ برای این کتابخانه به انتشار رسیده است و در آن جدا از باگزدایی، ویژگی های جدیدی نیز اضافه شده است برای مثال رابطه کاربردی برنامه نویسی افزوده شده و همچنین افزونه های مختلفی نیز برای آن ایجاد شده است در مجموع می توان این نسخه را یکی از کاملترین نسخه های ساخته شده تا به امروز شناخت.
مزایای استفاده از پانداس
مزایای استفاده از پانداس شامل موارد مختلفی میشوند که آنها را بیان میکنیم و در ادامه به موضوع Groupby در پانداس نیز خواهیم پرداخت؛
کتابخانه پانداس قادر به ارائه ساختارهای سری و دیتا فریم میباشد که بر این اساس قالب مناسبی برای تحلیل داده ها فراهم میشود.
پانداس پکیجی کامل متشکل از چند متد مختلف برای پالایش داده ها به بهترین روش ممکن میباشد.
این کتابخانه ابزارهای مختلفی دارد که قادر به وارد کردن یا خارج کردن داده ها با فرمت هایی مثل MS Excel ،TSV ،CSV می باشند.
نصب Pandas
خوشبختانه می توان کتابخانه پانداس را با استفاده از pip نصب کرد به همین دلیل میتوان از قطعه کد زیر استفاده نمود:
$ pip install pandas
سیستم هایی که آناکوندا را نصب دارند میتوانند از قطعه کد زیر برای نصب کتابخانه پانداس استفاده کنند:
$ conda install pandas
شما کاربران عزیز در بهترین حالت باید آخرین نسخه از این کتابخانه را نصب کنید و در صورتی که قصد استفاده از نسخه های قدیمی را دارید حتماً باید موقع نصب ورژن دقیق خود را ثبت نمایید برای مثال نمونه کدی که در آن نسخه ۰.۲۰.۴ نصب شده، در ادامه آمده است.
$ conda install pandas=0.20.4
ساختار دادهها در پانداس
• Series
• دیتافریم (DataFrame)
در پانداس برای ذخیره سازی دادهها از دو ساختار بالا استفاده میشود که در ادامه توضیحات مختصری در رابطه با آنها بیان کرده و سپس به توضیح Groupby در پانداس میپردازیم.
Series در پانداس
series مفهمومی مثل آرایههای یکبُعدی دارد. series قادر به ذخیره سازی داده ها با انواع مقادیر مختلف است و این مقادیر نیز قابل تغییر میباشند اما توجه داشته باشید که اندازه series پانداس، غیر قابل تغییر است. به اولین عنصر در series، اندیس صفر تخصیص داده خواهد شد و اندیس آخرین عنصر در series برابر با N-1 است که در آن، N تعداد کل عنصرهای موجود در سری است.
جهت ایجاد Series پانداس، نخست باید با دستور این پورت بسته پانداس را وارد نمود باید؛
import pandas as pd
جهت ساخت Series، باید متد ()pd.Series فراخوانده شود و یک آرایه به شرح زیر تعریف شود.
series1 = pd.Series([1,2,3,4])
print نیز قطعه کدی برای نمایش محتوای Series میباشد.
print(series1)
خروجی:
۰ ۱
۱ ۲
۲ ۳
۳ ۴
dtype: int64
با توجه به آنچه در خروجی میبینید دو ستون وجود دارد که ستون اول دارای مقادیری هستند که از اندیس صفر شروع شده و ستون دوم مقادیری دارد که به series اضافه شدهاند. پس اولین ستون نمایش دهنده اندیس عناصر است.
ممکن است کاربران هنگام نمایش series متوجه خطا شوند و دلیل آن است که پانداس در حال جست و جوی اطلاعاتی برای نمایش است و به همین خاطر کاربر وظیفه دارد اطلاعات خروجی را برای سیستم فراهم نماید. با کد دستوری زیر میتوان مشکل بروز این خطا را حل کرد؛
import pandas as pd
import sys
sys.__stdout__ = sys.stdout
series1 = pd.Series([1,2,3,4])
print(series1)
یک Series میتواند با آرایه numpy ایجاد شود. با کد دستوری زیر میتوان یک numpy ساخت و آن را تبدیل به Seriesپانداس نمود.
import pandas as pd
import numpy as np
import sys
sys.__stdout__ = sys.stdout
fruits = np.array([‘apple’,’orange’,’mango’,’pear’])
series2 = pd.Series(fruits)
print(series2)
خروجی:
۰ apple
۱ orange
۲ mango
۳ pear
dtype: object
ابتدا کتابخانه های لازم و numpy ایجاد شدهاند.
تابع ()array برای ایجاد آرایهای از میوهها فراهانی شده است شده
تابع ()Series پانداس بهکار گرفته شده تا آرایهای که کاربر تمایل دارد آن را به یک series تبدیل کند به آن پاس داده شود.
تابع ()print نیز جهت نمایش Series مورد استفاده قرار گرفته است.
دیتافریم
برای توضیح Groupby در پانداس ابتدا باید با مفاهیم اولیه آشنا شویم، حال به ساختار داده دیتافریم DataFrame در پانداس میپردازیم که به نوعی یک جدول در نظر گرفته میشود.
وظیفه دیتا فریم سازماندهی داده ها در سطرها و ستونهای مختلف برای ایجاد یک خروجی دادههای دو بعدی میباشد. اندازه دیتا فریم متغیر است و میتوان آن را با مقادیری از انواع گوناگون پر کرد. در مجموع دیتا فریم قابل ویرایش بوده و برای ساخت آن میتوان کار را از پایه شروع کرد و یا ساختار دادههایی مانند آرایههای Numpy را به یک دیتافریم تبدیل کرد.
چگونگی ساخت یک DataFrame از پایه به شرح زیر است؛
print(series1)
خروجی:
۰ ۱
۱ ۲
۲ ۳
۳ ۴
dtype: int64
میتوان مشاهده کرد که دو ستون وجود دارد، ستون اول حاوی مقادیری است که از اندیس صفر شروع میشوند و ستون دوم حاوی مقادیری است که به series اضافه شدهاند. ستون اول اندیس عناصر را نشان میدهد. کاربر ممکن است هنگام نمایش series با خطا مواجه شود.
دلیل اصلی این خطا آن است که پانداس به دنبال اطلاعاتی میگردد که نمایش دهد. بنابراین، کاربر باید اطلاعات خروجی سیستم را فراهم کند. این خطا را میتوان با اجرای کد به صورت زیر حل کرد.
import pandas as pd
import sys
sys.__stdout__ = sys.stdout
series1 = pd.Series([1,2,3,4])
print(series1)
یک Series ممکن است از آرایه «نامپای» (numpy) ساخته شود. در ادامه یک آرایه numpy ساخته میشود و سپس، این آرایه به Series پانداس «تبدیل» (Convert) میشود.
import pandas as pd
import numpy as np
import sys
sys.__stdout__ = sys.stdout
fruits = np.array([‘apple’,’orange’,’mango’,’pear’])
series2 = pd.Series(fruits)
print(series2)
خروجی:
۰ apple
۱ orange
۲ mango
۳ pear
dtype: object
کار با وارد کردن کتابخانههای لازم، از جمله numpy آغاز شده است. سپس، تابع ()array فراخوانی شده تا یک آرایه از میوهها ساخته شود. پس از آن، از تابع ()Series پانداس استفاده شده و آرایهای که کاربر تمایل دارد آن را به یک series تبدیل کند به آن پاس داده میشود. در نهایت، تابع ()print برای نمایش Series مورد استفاده قرار میگیرد.
ساختار دیتافریم
ساختار داده دیتافریم (DataFrame) در پانداس را میتوان به عنوان یک جدول در نظر گرفت. دیتافریم، دادهها را در سطرها و ستونها سازماندهی میکند و از آنها یک ساختار داده دوبُعدی میسازد.
ستونها میتوانند حاوی مقادیری از انواع گوناگون باشند و در عین حال، اندازه دیتافریم قابل تغییر است؛ بنابراین میتوان آن را ویرایش کرد. برای ساخت دیتافریم، میتوان کار را از پایه شروع کرد و یا ساختار دادههایی مانند آرایههای نامپای Numpy را به یک دیتافریم تبدیل کرد.
چگونگی ساخت یک DataFrame از پایه
import pandas as pd
df = pd.DataFrame({
“Column1”: [1, 4, 8, 7, 9],
“Column2”: [‘a’, ‘column’, ‘with’, ‘a’, ‘string’],
“Column3”: [1.23, 23.5, 45.6, 32.1234, 89.453],
“Column4”: [True, False, True, False, True]
})
print(df)
خروجی:
Column1 Column2 Column3 Column4
۰ ۱ a 1.2300 True
۱ ۴ column 23.5000 False
۲ ۸ with 45.6000 True
۳ ۷ a 32.1234 False
۴ ۹ string 89.4530 True
همانطور که مشاهده میکنید در قطعه کد بالا یک دیتافریم با نام df ایجاد شده است. ستون اول دیتافریم (DataFrame) حاوی مقادیر صحیح، دومین ستون حاوی یک رشته، ستون سوم حاوی مقادیر «ممیز شناور» (Floating Point) و ستون چهارم حاوی مقادیر «بولی» (Boolean) است.
(print(df دستوری است که با استفاده از کنسول، دیتا فریم را به کاربران نمایش میدهد و شرایط بررسی تایید یا عدم تایید آن را برای کاربران فراهم مینماید البته موقع نمایش دیتا فریم ممکن است کاربر متوجه یک ستون اضافی در ابتدای جدول شود که عناصر آن از صفر شروع شدهاند از همین رو برای ساخت دیتابیس فریم میتوان از متد ()pd.DataFrame استفاده کرد که در مثال فوق نمونه آن را مشاهده کردید.
در واقع ایجاد یک DataFrame از لیست یا یک مجموعه از لیستها، مسئله دشواری است و شما کاربران نمیتوانید متد ()pd.DataFrame را فراخوانی نموده و پس از آن تنها آرگومان که همان متغیر لیست است را به آن بیافزایید.
برای درک بهتر این مطلب به مثال زیر توجه نمایید که در آن لیستی با نام mylist متشکل از پنج عدد ساخته شده و اعداد با متد ()DataFrame فراخوانی شده است. همچنین mylist به عنوان نام این لیست به آرگومان اختصاص داده شده است. در واقع در اینجا لیست به دیتا فریم تبدیل شده است و پس از آن محتوای آن پرینت گرفته میشود. همانطور که گفته شد دیتا فریم یک ستون پیش فرض دارد که از صفر شروع شده و اندیس ها را نمایش می دهد.
import pandas as pd
mylist = [4, 8, 12, 16, 20]
df = pd.DataFrame(mylist)
print(df)
خروجی:
۰
۰ ۴
۱ ۸
۲ ۱۲
۳ ۱۶
۴ ۲۰
در همین مورد به مثال زیر توجه نمایید؛
import pandas as pd
items = [[‘Phone’, 2000], [‘TV’, 1500], [‘Radio’, 800]]
df = pd.DataFrame(items, columns=[‘Item’, ‘Price’], dtype=float)
print(df)
خروجی:
Item Price
۰ Phone 2000.0
۱ TV 1500.0
۲ Radio 800.0
در این مثال، با مجموعهای از ۳ عنصر یک لیست ساخته شده استو هر عنصر، شامل یک نام و قیمت است.
در اینجا، لیست به متد ()DataFrame محول میشود تا آن را به یک آبجکت DataFrame تبدیل نماید.
نام ستونها برای دیتافریم هم تعیین شدهاند و مقادیر عددی به مقادیر ممیز شناور تبدیل شده اند چون آرگومان dtype از نوع ممیز شناور «float» تعریف شده است.
()describe تابعی است که برای به دست آوردن خلاصه داده های مربوط به آیتمها میتوان آن را روی متغیر دیتا فریم فراخوانی کرد؛
۱ df.describe()
خروجی:
Price
count 3.000000
mean 1433.333333
std 602.771377
min 800.000000
۲۵% ۱۱۵۰٫۰۰۰۰۰۰
۵۰% ۱۵۰۰٫۰۰۰۰۰۰
۷۵% ۱۷۵۰٫۰۰۰۰۰۰
max 2000.000000
تابع ()describe به ارائه جزئیات آماری میپردازد و گرفتن میانگین یا محاسبه انحراف معیار به دست آوردن عناصر حداقل و حداکثر و غیره از قابلیت های این تابع محسوب میشوند. describe راهکار خوبی برای کسب اطلاعات سریع و کلی پیرامون دادههایی محسوب میشود که کاربر در حال کار با آنها است مانند مثال Groupby در پانداس که در ادامه به آن خواهیم پرداخت. در مجموع برای مقایسه توابعی که دارای دادههای نسبتا مشابه هستند مناسب میباشد.
وارد کردن دادهها
در حالت کلی استفاده از کتابخانه پانداس برای بکارگیری اطلاعاتی که در فایلهای اکسل یا csv ذخیره شدهاند مورد نیاز میباشد. برای استفاده از این داده ها ابتدا باید آنها را در پانداس ایمپورت کنیم و خوشبختانه این کتابخانه برای بارگذاری داده ها از چنین منابعی با استفاده از متدهای مختلفی قابل پشتیبانی است.
وارد کردن دادههای CSV
یک فایل CSV یا همان Comma Separated Value به فایلی گفته میشود که مقادیر آن متنی بوده و هر یک به وسیله کاما از هم جدا میشوند. برای خواندن این فایل ها میتوان از کتابخانه پانداس استفاده نمود مثلاً یک فایل CSV با نام mashin.csv ایجاد شده و این فایل حاوی داده های زیر میباشد.
Number,Type,Capacity
SSD,Premio,1800
KCN,Fielder,1500
USG,Benz,2200
TCH,BMW,2000
KBQ,Range,3500
برای خواندن فایلmashin.csv به صورت زیر عمل میکنیم
import pandas as pd
data = pd.read_csv(mashin.csv’)
print(data)
خروجی:
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
در این مثال فایل CSV به متد read_csv پاس داده میشود زیرا در دایرکتوری اسکریپت پایتون ذخیره شده است و در این شرایط پوشه کاری جاری مورد بررسی قرار میگیرد. البته اگر فایل شما در مسیر دیگری ذخیره شده باشد باید نسبت به صحیح بودن مسیر ثبت شده اطمینان حاصل نمایید.
حتی گاهی اوقات تعداد سطرها یه مجموعه بسیار زیاد هستند که در این شرایط لازم است چند خط اول در کنسول چاپ شوند و نیازی به چاپ کل مجموعه نمیباشد با فراخوانی متد ()head روی دیتافریم با استفاده از کد دستوری زیر میتوان این کار را به انجام رسانید.
۱ data.head()
خروجی کد بالا به صورت زیر می باشد:
Number Type Capacity
۰ SSD Premio 1800
۱ KCN Fielder 1500
۲ USG Benz 2200
۳ TCH BMW 2000
۴ KBQ Range 3500
برای دادههای بالا، دستور تنها پنج سطر اول مجموعه داده را باز میگرداند و این امکان را فراهم میکند که کاربر، بخش کوچکی از دادهها را مورد بررسی قرار دهد.
با استفاده از متد ()loc میتوانید فقط سطرهایی که در مجموعه مشخص شدهاند را بخوانید در این خصوص به مثال زیر توجه کنید:
import pandas as pd
data = pd.read_csv(‘cars.csv’)
print (data.loc[[0, 4, 7], [‘Type’]])
خروجی:
Type
۰ Premio
۴ Range
۷ Fielder
برای مثال، در این قسمت با استفاده از متد ()loc عناصر در اندیس ۰، ۴ و ۷ از ستون Type، خوانده شدهاند.
درکل ممکن است گاهی نیاز به خوانده شدن ستون خاصی باشد و دیگر لزومی به خواندن ستون های دیگر نیست به همین دلیل از متد ()loc به شرح زیر استفاده میکنیم؛
import pandas as pd
data = pd.read_csv(‘cars.csv’)
print (data.loc[:, [‘Type’, ‘Capacity’]])
Type Capacity
۰ Premio 1800
۱ Fielder 1500
۲ Benz 2200
۳ BMW 2000
۴ Range 3500
۵ Premio 1800
۶ Benz 2200
۷ Fielder 1500
۸ BMW 2000
۹ Range 3200
در کد دستوری فوق از متد ()loc برای خواندن تمام بخش های متعلق به تنها دو ستون از مجموعه داده، یعنی ستونهای Type و Capacity که در آرگومان تعیین شدهاند، استفاده شده است.
وارد کردن دادههای اکسل
پانداس به جز read_csv از تابع read_excel برای خواندن فایلهای اکسل که در دیتا فریم پانداس میباشند، نیز استفاده میکند. برای مثال به کد زیر توجه کنید که برای بارگذاری محتوای فایل اکسلی به نام workers.xlsx در دیتافریم پانداس نوشته شده است:
import pandas as pd
data = pd.read_excel(‘workers.xlsx’)
print (data)
خروجی:
ID Name Dept Salary
۰ ۱ John ICT 3000
۱ ۲ Kate Finance 2500
۲ ۳ Joseph HR 3500
۳ ۴ George ICT 2500
۴ ۵ Lucy Legal 3200
۵ ۶ David Library 2000
۶ ۷ James HR 2000
۷ ۸ Alice Security 1500
۸ ۹ Bosco Kitchen 1000
۹ ۱۰ Mike ICT 3300
read_excel جهت باز کردن یا بارگذاری کردن فایل و سپس، تجزیه دادهها مورد استفاده قرار میگیرد.
پس از فراخوانی تابع read_excel، اسم فایل به عنوان آرگومان به آن پاس داده میشود.
تابع ()print به کاربر کمک میکند تا محتوای دیتافریم را نمایش دهد.
از طرفی این تابع را میتوان با متد ()loc ترکیب نمود تا به خواندن سطرها و ستونهای خاصی از فایل اکسل کمک کند، در همین راستا به مثال زیر توجه فرمایید:
import pandas as pd
data = pd.read_excel(‘workers.xlsx’)
print (data.loc[[1,4,7],[‘Name’,’Salary’]])
خروجی:
Name Salary
۱ Kate 2500
۴ Lucy 3200
۷ Alice 1500
در مثال فوق از متد ()loc استفاده شده است که علت آن به دست آوردن مقدار های مربوط به Name و Salary میباشد و به همین جهت از عناصر در اندیسهای ۱، ۴ و ۷ استفاده شده است.
پانداس امکان خواندن فایل از دو شیت مختلف را ایجاد کرده و با توجه به مثال زیر میتوانید این قابلیت را به خوبی درک کنید:
import pandas as pd
with pd.ExcelFile(‘workers.xlsx’) as x:
s1 = pd.read_excel(x, ‘Sheet1’)
s2 = pd.read_excel(x, ‘Sheet2’)
print(“Sheet 1:”)
print (s1)
print(“”)
print(“Sheet 2:”)
print (s2)
خروجی:
Sheet 1:
ID Name Dept Salary
۰ ۱ John ICT 3000
۱ ۲ Kate Finance 2500
۲ ۳ Joseph HR 3500
۳ ۴ George ICT 2500
۴ ۵ Lucy Legal 3200
۵ ۶ David Library 2000
۶ ۷ James HR 2000
۷ ۸ Alice Security 1500
۸ ۹ Bosco Kitchen 1000
۹ ۱۰ Mike ICT 3300
Sheet 2:
ID Name Age Retire
۰ ۱ John 55 2023
۱ ۲ Kate 45 2033
۲ ۳ Joseph 55 2023
۳ ۴ George 35 2043
۴ ۵ Lucy 42 2036
۵ ۶ David 50 2028
۶ ۷ James 30 2048
۷ ۸ Alice 24 2054
۸ ۹ Bosco 33 2045
۹ ۱۰ Mike 35 2043
پس از پرداختن به موضوعات فوق برای تکمیل شدن این مقاله در رابطه با Groupby در پانداس توضیحاتی را ارائه مینماییم ولی قبل از آن بهتر است به پیش پردازش داده ها و مفهوم آن نیز واقف شوید پس با ادامه این مقاله همراه ما باشید.
پیش پردازش دادهها
Data Wrangling یا همان پیش پردازش اطلاعات جهت آماده کردن دادهها برای استفاده در گام های بعدی مورد استفاده قرار میگیرد. مثلاً گروه بندی یا ادغام کردن فرایندها، مرتبط با همین زمینه میباشندگ با این کار داده ها به حالتی تبدیل میشوند که برای تحلیل یا ترسیم الگوریتم بهتر بتوان روی آنها مبانی لازم را اجرا نمود.
ادغام
با استفاده از تابع ()merge در کتابخانه پانداس میتوان آبجکت های موجود در یک دیتا فریم را به یکدیگر متصل نمود. با توجه به مثال زیر میتوانید روش ادغام شدن دو دیتا فریم ساخته شده را مشاهده کنید. کد مربوط به دیتافریم df1 آورده شده است.
import pandas as pd
d = {
‘subject_id’: [‘1’, ‘2’, ‘3’, ‘4’, ‘5’],
‘student_name’: [‘John’, ‘Emily’, ‘Kate’, ‘Joseph’, ‘Dennis’]
}
df1 = pd.DataFrame(d, columns=[‘subject_id’, ‘student_name’])
print(df1)
خروجی:
subject_id student_name
۰ ۱ John
۱ ۲ Emily
۲ ۳ Kate
۳ ۴ Joseph
۴ ۵ Dennis
کد زیر، مربوط به ساخت دومین دیتافریم، df2، است:
import pandas as pd
data = {
‘subject_id’: [‘4’, ‘5’, ‘6’, ‘7’, ‘8’],
‘student_name’: [‘Brian’, ‘William’, ‘Lilian’, ‘Grace’, ‘Caleb’]
}
df2 = pd.DataFrame(data, columns=[‘subject_id’, ‘student_name’])
print(df2)
خروجی:
subject_id student_name
۰ ۴ Brian
۱ ۵ William
۲ ۶ Lilian
۳ ۷ Grace
حال با استفاده از کد زیر ۲ دیتافریم یعنی df1 و df2 در امتداد مقادیر subject_id با یکدیگر ادغام می شوند. انجام این کار با استفاده از فراخوانی تابع ()merge به انجام میرسد.
۱ pd.merge(df1, df2, on=’subject_id’)
خروجی:
subject_id student_name_x student_name_y
۰ ۴ Joseph Brian
۱ ۵ Dennis William
با انجام عمل ادغام کردن سطرهایی که مقادیر یکسان دارند از هر دو دیتا فریم انتخاب شده و ستونهایی که کاربر برای ادغام استفاده میکند بازگردانده می
شود.
در ادامه به ارائه توضیحاتی در رابطه با Groupby در پانداس میپردازیم؛
Groupby در پانداس
در مجموع برای گروه بندی، سازماندهی و کشف اطلاعات جدولی در حجم بسیار بالا از پانداس استفاده میشود. برخی اوقات نیز کاربران برای انجام بررسیهای بیشتر و تحلیل های گسترده تر نیاز دارند که دیتا فریم های پانداس را به زیر مجموعههای مختلفی تقسیم کنند. مثلا اگر در نظر بگیریم که یک کاربر برای دادههای تابلویی بورس نیاز به دیتا فریم داشته باشد میتواند آن را به صورت زیر کدنویسی نماید:
>>> df
date symbol open high low close volume
۰ ۲۰۱۹-۰۳-۰۱ AMZN 1655.13 1674.26 1651.00 1671.73 4974877
۱ ۲۰۱۹-۰۳-۰۴ AMZN 1685.00 1709.43 1674.36 1696.17 6167358
۲ ۲۰۱۹-۰۳-۰۵ AMZN 1702.95 1707.80 1689.01 1692.43 3681522
۳ ۲۰۱۹-۰۳-۰۶ AMZN 1695.97 1697.75 1668.28 1668.95 3996001
۴ ۲۰۱۹-۰۳-۰۷ AMZN 1667.37 1669.75 1620.51 1625.95 4957017
۵ ۲۰۱۹-۰۳-۰۱ AAPL 174.28 175.15 172.89 174.97 25886167
۶ ۲۰۱۹-۰۳-۰۴ AAPL 175.69 177.75 173.97 175.85 27436203
۷ ۲۰۱۹-۰۳-۰۵ AAPL 175.94 176.00 174.54 175.53 19737419
۸ ۲۰۱۹-۰۳-۰۶ AAPL 174.67 175.49 173.94 174.52 20810384
۹ ۲۰۱۹-۰۳-۰۷ AAPL 173.87 174.44 172.02 172.50 24796374
۱۰ ۲۰۱۹-۰۳-۰۱ GOOG 1124.90 1142.97 1124.75 1140.99 1450316
۱۱ ۲۰۱۹-۰۳-۰۴ GOOG 1146.99 1158.28 1130.69 1147.80 1446047
۱۲ ۲۰۱۹-۰۳-۰۵ GOOG 1150.06 1169.61 1146.19 1162.03 1443174
۱۳ ۲۰۱۹-۰۳-۰۶ GOOG 1162.49 1167.57 1155.49 1157.86 1099289
۱۴ ۲۰۱۹-۰۳-۰۷ 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
۰ ۲۰۱۹-۰۳-۰۱ AMZN 1655.13 1674.26 1651.00 1671.73 4974877
۱ ۲۰۱۹-۰۳-۰۴ AMZN 1685.00 1709.43 1674.36 1696.17 6167358
۲ ۲۰۱۹-۰۳-۰۵ AMZN 1702.95 1707.80 1689.01 1692.43 3681522
۳ ۲۰۱۹-۰۳-۰۶ AMZN 1695.97 1697.75 1668.28 1668.95 3996001
۴ ۲۰۱۹-۰۳-۰۷ AMZN 1667.37 1669.75 1620.51 1625.95 4957017
۵ ۲۰۱۹-۰۳-۰۱ AAPL 174.28 175.15 172.89 174.97 25886167
۶ ۲۰۱۹-۰۳-۰۴ AAPL 175.69 177.75 173.97 175.85 27436203
۷ ۲۰۱۹-۰۳-۰۵ AAPL 175.94 176.00 174.54 175.53 19737419
۸ ۲۰۱۹-۰۳-۰۶ AAPL 174.67 175.49 173.94 174.52 20810384
۹ ۲۰۱۹-۰۳-۰۷ AAPL 173.87 174.44 172.02 172.50 24796374
۱۰ ۲۰۱۹-۰۳-۰۱ GOOG 1124.90 1142.97 1124.75 1140.99 1450316
۱۱ ۲۰۱۹-۰۳-۰۴ GOOG 1146.99 1158.28 1130.69 1147.80 1446047
۱۲ ۲۰۱۹-۰۳-۰۵ GOOG 1150.06 1169.61 1146.19 1162.03 1443174
۱۳ ۲۰۱۹-۰۳-۰۶ GOOG 1162.49 1167.57 1155.49 1157.86 1099289
۱۴ ۲۰۱۹-۰۳-۰۷ GOOG 1155.72 1156.76 1134.91 1143.30 1166559
در مثال فوق کتابخانههای Pandas و NumPy ایمپورت شدهاند و پس از آن، یک دیتافریم پایهای دادههای CSV از یک URL، دانلود و راهاندازی شدهاند. پس از اینکه مجموعه دادهها در کنسول چاپ شدند تا متوجه شویم چه مقادیری در آن موجود میباشد، حال میتوانیم بر اساس اسم یا نماد سهام دیتا فریم را گروه بندی کنیم.
برای بکارگیری و استفاده از groupby، یک ستون یا تعداد بیشتری ستون را به آن پاس دهید. (symbol نام ستون برای گروهبندی است.)
>>> symbols = df.groupby(‘symbol’)
>>> print(symbols.groups)
{‘AAPL’: Int64Index([5, 6, 7, 8, 9], dtype=’int64′),
‘AMZN’: Int64Index([0, 1, 2, 3, 4], dtype=’int64′),
‘GOOG’: Int64Index([10, 11, 12, 13, 14], dtype=’int64′)}
اگرچه ممکن است درک خروجی با توجه به گروه هایی که چاپ شدهاند کمی دشوار به نظر برسد اما میتوان دید که سه گروه AMZN ،AAPL و GOOG موجود هستند و هر یک از این گروهها دارای اندیس سطر های مربوط به دیتا فریم اصلی میباشند.
Groupby در پانداس در برابر دریافت ورودی کاملاً انعطافپذیر است به طوری که حتی کاربر میتواند چندین ستون را برای گروه بندی در نظر بگیرد. مثلا اگر ستون زمان نیز وجود داشت میتوانستیم هر دو نماد سهام و زمان را برای گروه بندی اطلاعات و تجزیه و تحلیل آن در بازه های زمانی مشخص به کار بگیریم.
استفاده از تابع سفارشی در Groupby پانداس
در مثال قبل، نام ستون به متد groupby سپرده شد و بدین ترتیب هر داده در دیتا فریم یک شماره اندیس دریافت نمود. از طرفی لازم به بازگرداندن یک مقدار برای گروه بندی مورد نظر میباشد. همین مسئله انعطاف پذیری بالایی را برای گروه بندی ایجاد میکند که البته منطق آن کمی پیچیده است.
مثلاً فکر کنید یک کاربر میخواهد سطرها را با توجه به اینکه میزان افزایش آن در یک روز خاص چقدر بوده است گروه بندی کند یا این که بخواهد بداند در چنین روزی قیمت سهام افزایش داشته است یا خیر بدین ترتیب باید به صورت زیر و با استفاده از کد دستوری زیر این محاسبات را انجام دهد؛
>>> def increased(idx):
… return df.loc[idx].close > df.loc[idx].open
…
>>> df.groupby(increased).groups
{False: Int64Index([2, 3, 4, 7, 8, 9, 13, 14], dtype=’int64′),
True: Int64Index([0, 1, 5, 6, 10, 11, 12], dtype=’int64′)}
در این مثال تابعی با نام increased برای دریافت اندیسها تعریف شده است که میتواند مقدار true یا false را بر اساس قیمت نهایی سهام بازگرداند. وقتی تابع به متد ()groupby پاس داده شد، دیتافریم با توجه به آنکه قیمت تعطیلی بورس بیشتر از قیمت بازگشایی آن در همان روز بوده یا نه، در دو گروه تقسیمبندی میشود.
عملیات روی گروههای پانداس
بعد از ساخته شدن گروههای مختلف توسط Groupby در پانداس حال میتوان ویرایش های لازم را روی دادههای که در گروههای مختلف موجود هستند به انجام رسانید. مثلاً با توجه به مثال بالا میتوان از کد دستوری زیر برای گرفتن میانگین حجم معاملات در نمادهای مختلف استفاده نمودک
>>> symbols[‘volume’].agg(np.mean)
symbol
AAPL 23733309.4
AMZN 4755355.0
GOOG 1321077.0
Name: volume, dtype: float64
حال باید ستونهایی که کاربر نیاز به انجام عملیات روی آنها دارد تعیین شده و پس از آن با متد agg میانگین آنها گرفته شود. بی شک نتیجه نهایی میانگین هر سه نماد خواهد بود. با انجام این عملیات میتوان فهمید که حجم معاملات AAPL یک درجه بزرگتر از حجم معاملات AMZN و GOOG میباشد.
تکرار و انتخاب گروهها
با Groupby در پانداس نیز میتوان از حلقه for استفاده نمود. این کتابخانه نسبت به تکرار حلقه پشتیبانی خوبی را در پایتون ارائه نموده است؛
>>> for symbol, group in symbols:
… print(symbol)
… print(group)
…
AAPL
date symbol open high low close volume
۵ ۲۰۱۹-۰۳-۰۱ AAPL 174.28 175.15 172.89 174.97 25886167
۶ ۲۰۱۹-۰۳-۰۴ AAPL 175.69 177.75 173.97 175.85 27436203
۷ ۲۰۱۹-۰۳-۰۵ AAPL 175.94 176.00 174.54 175.53 19737419
۸ ۲۰۱۹-۰۳-۰۶ AAPL 174.67 175.49 173.94 174.52 20810384
۹ ۲۰۱۹-۰۳-۰۷ AAPL 173.87 174.44 172.02 172.50 24796374
AMZN
date symbol open high low close volume
۰ ۲۰۱۹-۰۳-۰۱ AMZN 1655.13 1674.26 1651.00 1671.73 4974877
۱ ۲۰۱۹-۰۳-۰۴ AMZN 1685.00 1709.43 1674.36 1696.17 6167358
۲ ۲۰۱۹-۰۳-۰۵ AMZN 1702.95 1707.80 1689.01 1692.43 3681522
۳ ۲۰۱۹-۰۳-۰۶ AMZN 1695.97 1697.75 1668.28 1668.95 3996001
۴ ۲۰۱۹-۰۳-۰۷ AMZN 1667.37 1669.75 1620.51 1625.95 4957017
GOOG
date symbol open high low close volume
۱۰ ۲۰۱۹-۰۳-۰۱ GOOG 1124.90 1142.97 1124.75 1140.99 1450316
۱۱ ۲۰۱۹-۰۳-۰۴ GOOG 1146.99 1158.28 1130.69 1147.80 1446047
۱۲ ۲۰۱۹-۰۳-۰۵ GOOG 1150.06 1169.61 1146.19 1162.03 1443174
۱۳ ۲۰۱۹-۰۳-۰۶ GOOG 1162.49 1167.57 1155.49 1157.86 1099289
۱۴ ۲۰۱۹-۰۳-۰۷ GOOG 1155.72 1156.76 1134.91 1143.30 1166559
در هر بار تکرار شیء دو مقدار بازگردانده میشود که یکی ستونهایی است که در گروه بندی مشخص شدهاند و به آن مقدار شناساگر گفته میشود، دیگری خود گروه است که یک شی دیتا فریم به حساب میآید.
متد get_group در پانداس
از متد get_group می توان برای بازیابی یک گروه مجرد استفاده نمود، البته در صورتی که خود کاربر نیاز به انعطاف پذیری بالایی برای دستکاری یک گروه مجرد داشته باشد.
>>> aapl = symbols.get_group(‘AAPL’)
>>> aapl
date symbol open high low close volume
۵ ۲۰۱۹-۰۳-۰۱ AAPL 174.28 175.15 172.89 174.97 25886167
۶ ۲۰۱۹-۰۳-۰۴ AAPL 175.69 177.75 173.97 175.85 27436203
۷ ۲۰۱۹-۰۳-۰۵ AAPL 175.94 176.00 174.54 175.53 19737419
۸ ۲۰۱۹-۰۳-۰۶ AAPL 174.67 175.49 173.94 174.52 20810384
۹ ۲۰۱۹-۰۳-۰۷ AAPL 173.87 174.44 172.02 172.50 24796374
>>> type(aapl)
<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 استفاده کند. اکنون، میتوان از متد value_counts پانداس برای نمایش شکل ستون volume استفاده کرد؛
>>> df[‘volume’].value_counts(bins=4)
(۱۰۷۲۹۵۲٫۰۸۵, ۷۶۸۳۵۱۷٫۵] ۱۰
(۲۰۸۵۱۹۷۴٫۵, ۲۷۴۳۶۲۰۳٫۰] ۳
(۱۴۲۶۷۷۴۶٫۰, ۲۰۸۵۱۹۷۴٫۵] ۲
(۷۶۸۳۵۱۷٫۵, ۱۴۲۶۷۷۴۶٫۰] ۰
Name: volume, dtype: int64
الحاق
در ادامه مبحث Groupby در پانداس، در قطعه کد زیر نحوه الحاق کردن یا همان افزودن دادهها از یک مجموعه به مجموعه دیگر که در مثال فوق با نامهای df1 و df2، معرفی شده بودند، را با دو ستون subject_id و student_name، مشاهده خواهید کرد.
۱ print(pd.concat([df1, df2]))
خروجی:
subject_id student_name
۰ ۱ John
۱ ۲ Emily
۲ ۳ Kate
۳ ۴ Joseph
۴ ۵ Dennis
۰ ۴ Brian
۱ ۵ William
۲ ۶ Lilian
۳ ۷ Grace
۴ ۸ Caleb
آمار توصیفی
تابع ()describe، برای ارائه آمار توصیفی مربوط به ستونهایی با مقادیر عددی میباشد که درین تابع ستونهای متشکل از کاراکتر در نظر گرفته نمیشوند. در قطعه کد زیر مثالی از ساخت یک دیتابیس فریم آورده شده است که اسامی دانش آموزان و رتبه آنها را در دروس ریاضی و انگلیسی نمایش میدهد.
import pandas as pd
data = {
‘Name’: [‘John’, ‘Alice’, ‘Joseph’, ‘Alex’],
‘English’: [64, 78, 68, 58],
‘Maths’: [76, 54, 72, 64]
}
df = pd.DataFrame(data)
print(df)
خروجی:
English Maths Name
۰ ۶۴ ۷۶ John
۱ ۷۸ ۵۴ Alice
۲ ۶۸ ۷۲ Joseph
۳ ۵۸ ۶۴ Alex
حال با استفاده از کد زیر می توان، به فراخوانی تابع ()describe بر روی دیتا فریم پرداخت و به دریافت سنجههای گوناگون مانند میانگین، انحراف معیار، میانه، عنصر بیشینه، عنصر کمینه و دیگر دسترسی پیدا کرد؛
۱ df.describe()
خروجی:
English Maths
count 4.000000 4.000000
mean 67.000000 66.500000
std 8.406347 9.712535
min 58.000000 54.000000
۲۵% ۶۲٫۵۰۰۰۰۰ ۶۱٫۵۰۰۰۰۰
۵۰% ۶۶٫۰۰۰۰۰۰ ۶۸٫۰۰۰۰۰۰
۷۵% ۷۰٫۵۰۰۰۰۰ ۷۳٫۰۰۰۰۰۰
max 78.000000 76.000000
به طور کاملا واضح مشخص است که این متد ستون نام را نادیده گرفته و فقط مقادیر عددی را برای دریافت آمار با توجه به نیاز کاربر در دسترس قرار داده است.
نتیجهگیری
در مجموع میتوان گفت که Groupby در پانداس علمی بسیار کاربردی و متناسب برای استفاده در فرایندهای مختلف بوده و توابع مختلفی نیز دارد که برای دستکاری یا پیش پردازش دادهها بسیار مفید هستند. امیدواریم از مطالعه این مقاله لذت برده باشید.