4 توصیه مهم برای استفاده از تابع groupby از کتابخانه Pandas
کتابخانه Pandas محبوبترین کتابخانه مورداستفاده در فعالیتهای تحلیلی و اصلاحی است. به کمک توابع متنوع این کتابخانه میتوان تحلیل دادهها را بدون مشکل و به سرعت انجام داد. علاوه بر این، دستورالعملهای آن بسیار ساده و قابلفهم میباشند. در این مقاله، تمرکز ما تنها بر روی یکی از توابع Pandas به نام تابع groupby است. اینها برای گروهبندی دادهها بر اساس مقادیر متمایز موجود یک ستون استفاده میشوند. پس از انجام این گروهبندی میتوان با توجه گروههای حاصله روی ستونهای حاوی مقادیر عددی تحلیل آماری انجام داد یا یک تابع دیگر را روی آنها اعمال نمود.
با بررسی مثال زیر درک این فرایند آسانتر خواهد شد. برای شروع کار باید کتابخانههای موردنیاز را وارد برنامه کنیم.
استفاده از تابع groupby از کتابخانه Pandas
برای اجرای این مثال به یک دیتاست نیز نیاز خواهیم داشت. به این منظور، از یک دیتاست کوچک که حاوی اطلاعات خانههای شهر ملبورن است، استفاده میکنیم. میتوانید آن را از این آدرس بارگیری نمایید.
df = pd.read_csv("/content/melb_data.csv", usecols = ['Price','Landsize','Distance','Type', 'Regionname']) df = df[(df.Price < 3_000_000) & (df.Landsize < 1200)].sample(n=1000).reset_index(drop=True) df.head()
در این کد استفاده از پارامتر usecols که در پرانتز جلوی تابع read_csv تعریف شده، به کاربر اجازه میدهد که تنها ستونهای موردنیاز خود را از میان ستونهای فایل csv بخواند. در بخش بعد، دادههای پرت ستونهای price و landsize را نیز حذف شده است و در آخر، با استفاده از تابع sample یک نمونه تصادفی و شامل 1000 مشاهده (یا سطر) از این دیتاست برگزیده شد.
پیش از بیان توصیه اصلی، یک بار تابع groupby اجرا میشود، به نحوی که پس از گروهبندی دادهها بر اساس ستون Typeمتوسط فاصله هر گروه از منطقه تجاری شهر محاسبه شود.
df[['Type','Distance']].groupby('Type').mean()
همانطور که میبینید، خانههایی که در این دیتاست در نوع h قرار گرفتهاند در مقایسه با دو نوع دیگر، فاصله بیشتری با منطقه تجاری مرکز شهر دارند. حال میتوانیم به سراغ توصیههای من برویم که به شما میآموزند چطور کارایی تابع groupby را بالا برده و بهترین استفاده را از آن بکنید.
نام ستونها را تغییر دهید
تابع groupby به طور پیشفرض نام ستونها را تغییر نمیدهد و به همین دلیل، نمیتوان متوجه شد که مقادیر تجمعی ذاتاً بیانگر چه چیزی هستند. برای مثال، اگر در دیتافریم بالا (که میانگین فاصله را براساس نوع خانهها محاسبه کردیم) نام ستون distance را به avg_distance (به معنای میانگین فاصله) تغییر میدادیم، قطعاً نام بامعناتری برای این ستون بود.
یک راه برای انجام این کار است که به جای تابع mean از تابع agg استفاده کنیم.
df[['Type','Distance']].groupby('Type').agg( avg_distance = ('Distance', 'mean')(
البته میتوان پس از اجرای همان کد قبلی نیز نام ستون را تغییر داد، اما این روش معقولتر و کاربردیتر است. اگر به جای یک ستون با چندین ستون سروکار داشته باشیم و یا بخواهیم توابع مختلفی را روی یک ستون اعمال کنیم، اهمیت تغییر نام ستونها واضحتر خواهد بود. به علاوه باید اشاره کنم که تابع agg میتواند چندین ستون را به صورت همزمان پردازش کند. به این منظور تنها کافی است نام ستونها و تابع را مشخص کنیم.
df[['Type','Distance']].groupby('Type').agg(avg_distance = ('Distance', 'mean'),median_distance = ('Distance', 'median'))
از عبارات Lambda استفاده کنید
عبارت Lambda نوعی خاص از توابع پایتون است که برای تعریف آن از کلیدواژه def استفاده نمیشود و به همین دلیل نیز نیازی به تخصیص یک نام خاص به آن نیست. هدف اصلی استفاده از عبارت Lambda سادهسازی کد است. این تابع یک خطی بوده و تنها یک بار قابل استفاده است.
در تابع agg میتوان از عبارات Lambda نیز استفاده کرد. به این ترتیب میتوان تبدیلات و محاسبات پیچیدهتری را در کنار تابع groupby بر روی دیتافریم اعمال کرد. برای مثال، میتوانیم متوسط قیمت هر یک از انواع خانهها را محاسبه کرده و سپس رقم آن را برحسب میلیون دلار بیان کنیم. برای این کار باید از یک عبارت Lambda استفاده نمود.
df[['Type','Price']].groupby('Type').agg( avg_price_million = ('Price', lambda x: x.mean() / 1_000_000) ).round(2)
از پارامتر As_index کمک بگیرید
تابع groupby ستونی که دیتافریم براساس آن گروهبندی شده است را به عنوان شاخص دیتافریم خروجی درنظر میگیرد. اما اگر چندین گروهبندی تو در تو Nested groups انجام داده باشیم، ظاهر دیتافریم چندان زیبا نخواهد شد.
df[['Type','Regionname', 'Distance']]\ .groupby(['Type','Regionname']).mean().head()
اگر بخواهیم بعداً روی این دیتافریم تحلیلی انجام دهیم، منطقی نیست که ستون type و region ستونهای شاخص درنظر گرفته شوند. در این شرایط میتوان از تابع reset_index استفاده کرد. اما یک راه بهتر و بهینهتر نیز برای این کار وجود دارد.
اگر پارامتر as_index را در تابع groupby تعریف کرده و مقدار آن را برابر False قرار دهیم، ستونهایی که گروهبندی بر اساس آنها صورت گرفته، به عنوان ستونهای معمولی در دیتافریم نمایش داده میشوند نه به عنوان ستون شاخص.
df[['Type','Regionname', 'Distance']]\ .groupby(['Type','Regionname'], as_index=False).mean().head()
مقادیر گمشده را نیز درنظر بگیرید
تابع groupby بهطور پیشفرض خانههای خالی از داده را در نظر نمیگیرد. بگذارید برای توضیح این موضوع ابتدا مقادیر موجود در تعدادی از سلولهای ستون Type را به NaN تبدیل کنم:
df.iloc[100:150, 0] = np.nan
با استفاده از تابع iloc میتوان مجموعهای از سطرها و ستونها را به کمک اندیس آنها انتخاب کرد و روی آنها عملیات خاصی را انجام داد. در کد بالا، سطرهای 100 تا 150 ستون اول (که اندیس آن صفر است) را انتخاب کرده و مقادیر درون این سلولها را برابر NaN گذاشتهام.
حال اگر بخواهیم مثل قبل میانگین فاصله هر یک از انواع خانهها را از منطقه تجاری شهر محاسبه کنیم، تابع groupby بدون توجه به مقادیر گمشده، محاسبات را انجام میدهد و به ما اطلاعاتی درباره مقادیر گمشده نمیدهد.
df[['Type','Distance']].groupby('Type').mean()
در برخی موارد، اطلاعات دادههای گمشده را نیاز داریم تا بتوانیم آنها را مدیریت کنیم. با تعریف پارامتر dropna در تابع groupby میتوانیم مجموع مقادیر سطرهایی که دارای مقادیر گمشده هستند را نیز محاسبه کنیم.
df[['Type','Distance']].groupby('Type', dropna=False).mean()
سخن آخر
تابع groupby یکی از پرکاربردترین توابعی است که در فرایند تحلیل کاوشگرانه دادهها Exploratory data analysis استفاده میشود. تا بتوان روابط بین متغیرهای را شناسایی کرد. به همین دلیل، توانایی استفاده کارآمد از این تابع حائز اهمیت است و در فرآیند تحلیل دادهها با Pandas کمک زیادی به ما میکند. با به کارگیری این 4 توصیه در هنگام استفاده از تابع groupby میتوانید از تمام تواناییها و قابلیتهای آن به نحو احسن استفاده کنید.