بکندباز

نحوه فیلتر کردن ردیف ها و انتخاب ستون ها در یک dataFrame با Pandas

برای یک دانشجوی علم داده، pandas یک کتابخانه ضروری برای اصلاح داده ها به شمار می رود. در بسیاری از مشاغل که با استفاده از پایتون با داده ها سروکار دارند، دانستن نحوه کار با این کتابخانه، ضروری و مورد انتظار است. بیایید شما را با تمام ابزارهای قدرتمندی که pandas ارائه می دهد، آشنا کنیم!

پایتون یکی از پرکاربردترین زبان های برنامه نویسی امروزی است. توانایی کار با داده ها بسیار مورد توجه است و مشاغلی با عنوان مهندسین علوم داده، تحلیلگر داده و مهندسان یادگیری ماشین بسیار محبوب هستند.

دوره پیشنهادی = دوره مقدماتی آموزش پایتون

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

“سری زمانی” نوع مهم دیگری از ساختار است که با ثبت مشاهدات مکرر برخی پدیده ها در طول زمان به دست می آید. این نوع داده ها به طور گسترده در پیش بینی های مالی و آب و هوا استفاده می شود.

برای به دست آوردن بینش از داده های سری زمانی، مهم است که بدانید چگونه آنها را به درستی در یک نمودار تصویر سازی کنید. ما در این مقاله سری‌های زمانی را پوشش نمی‌دهیم، اما در مقاله تصویر سازی سری زمانی در pandas می‌توانید خود را برای تصویر سازی چنین داده‌هایی آماده کنیم.

پرکاربردترین عملیات pandas

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

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

برای تمام مثال‌های این مقاله، از مجموعه داده‌ای از دانش‌آموزان استفاده می‌کنیم. بیایید با کاوش شروع کنیم:

ایندکس ردیف ها در pandas

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

import pandas as pd
Report_Card = pd.read_csv("Report_Card.csv")
Report_Card.head(3)

مقاله مرتبط = خواندن و نوشتن در فایل csv در پایتون

این کد 3 ردیف اول را از بالای قاب داده (data frame) برمی گرداند. این روش خوبی است که وقتی از یک مجموعه داده ای بزرگ استفاده می کنیم ابتدا با ‎head()‎ یا ‎tail()‎ نگاهی به چند ردیف از آن بیندازیم و بر اساس آن برنامه ریزی کنیم. tail()، همانطور که ممکن است حدس بزنید، برای چاپ عناصر از ردیف های پایین قاب داده استفاده می شود.

خروجی این قطعه به صورت زیر است:

Name Class Lecture Grade Homework
0 Cindy Lars D History 96 3.0
1 Siya Vu D Mathematics 72 2.0
2 Billy Key A German 89 1.0

توجه داشته باشید که اعدادی مانند 0 و 1 را به عنوان ایندکس داریم. اگر از قبل می دانیم که کدام ردیف ها را می خواهیم، ​​می توانیم به سادگی از ویژگی iloc برای تعیین ردیف ها از روی ایندکس آنها استفاده کنیم. این ویژگی به ما امکان می دهد که به لیستی از سطرها و ستون ها بر اساس موقعیت های عددی آنها دسترسی داشته باشیم. به عبارت دیگر، می‌توانیم در dataFrame ها نیز مانند هر چیز دیگری در پایتون با ایندکس ها کار کنیم.

فرض کنید ردیف متعلق به Siya Vu را می خواهیم. به سادگی می توانیم با کد زیر آن را استخراج کنیم:

Report_Card.iloc[1]

برای به دست آوردن نتیجه مشابه head(3)، می توانیم از محدوده ای از ایندکس ها مانند iloc[0:3] استفاده کنیم.

اگر می‌خواهیم اطلاعات خاصی در مورد دانش‌آموزان خاص به‌دست آوریم و از قبل اعداد ایندکس آنها را می‌دانیم، می‌توانیم از آرگومان‌های iloc برای ستون‌ها و سطرها استفاده کنیم:

Report_Card.iloc[[7,4,12],0:3]

به خاطر داشته باشید که می توانید از آرایه ای از ایندکس ها  و یا محدوده ای از آنها استفاده کنید. قطعه کد بالا سطرهای شماره هفت، چهار و دوازده و ستون های 0 تا 2 را شامل می شود. اگر آرگومان دوم iloc در مثال بالا را حذف کنیم، تمام ستون ها را برمی گرداند.

ایندکس ستون ها در pandas

فرض کنید می خواهیم میانگین نمرات مدرسه خود را برای مشخص کردن رتبه بندی ببینیم. می توانیم ستون Grades را از جدول داده استخراج کنیم. استفاده از Report_Card["Grades"] کل این ستون را برمی گرداند. ایندکس ستون ها در pandas همان عنوان ستون ها است. سپس می توانیم تابع ‎mean()‎ را به ستون اعمال کنیم و مقدار میانگین را بدست آوریم، که برابر می شود با 72.3789 .

اگر ما مدیر این مدرسه خیالی بودیم شاید میانگین نمرات کلاس را با هم مقایسه می کردیم تا بفهمیم کجا را باید بهبود دهیم. برای این کار، به هر دو ستون Grades و Class نیاز داریم.  می توانیم آنها را از روی ایندکس شان بدست آوریم. برای به دست آوردن میانگین کلاس ها، می توانیم از قطعه کد زیر استفاده کنیم:

class_info = Report_Card[["Grades","Class"]]
class_info.groupby("Class").‎mean()‎

خط اول کد یک جدول داده جدید با تنها دو ستون به ما می دهد. ذکر این نکته مهم است که ما لیستی از نام ستون ها را به عنوان آرگومان ارائه می کنیم زیرا بیش از یکی از آنها را می خواهیم. در خط دوم، از تابع ‎groupby()‎ با آرگومان  Class  استفاده می کنیم. این کار همه سطرهایی که دارای نام کلاس مشترک هستند را گروه بندی می کند. سپس با استفاده از تابع ‎mean()‎ روی گروه ها، جدول زیر را به دست می آید:

Class Grade
A 70.06
B 76.20
C 71.70
D 73.13

به نظر می‌رسد که کمترین میانگین نمره از کلاس A است. اکنون می‌توانیم برای کمک به دانش‌آموزان این کلاس، بیشتر این موضوع را بررسی کنیم.

یکی دیگر از موارد استفاده از ایندکس در ستون برای بدست آوردن مقادیر مورد نیاز ما در یک محدوده است. در اینجا یک مثال است:

Report_Card.loc[:,'Name':'Lectures']
Report_Card.iloc[:,0:3]

کولون در هر دو مورد مخفف “همه” است.

مراقب تفاوت این دو متد باشید. در loc، از نام ستون ها استفاده می کنیم و هر دو انتهای محدوده شامل می شود یعنی در مثال بالا خود دو ستون Name و Lectures نیز انتخاب می شوند، البته به همراه هر ستونی که بین آنها باشد.

در مقابل، در iloc، از شاخص های عددی استفاده می کنیم و انتهای سمت راست محدوده شامل نمی شود. یعنی در مثال بالا از ستون شماره 0 تا ستون شماره 2 استخراج شده و ستون 3 را شامل نمی شود.

در مثال بالا، در هر دو متد همه ردیف ها انتخاب می شوند چرا که از علامت کولون : استفاده شده است.

فیلتر کردن ردیف ها بر اساس شرایط

بیایید با انتخاب دانش آموزان از کلاس A شروع کنیم. این کار را می توان به صورت زیر انجام داد:

class_A = Report_Card.loc[(Report_Card["Class"] == "A")]

ما از ویژگی loc استفاده می‌کنیم که به ما امکان می‌دهد به گروهی از سطرها و/یا ستون‌ها توسط برچسب‌ها یا یک دستور شرطی بولین دسترسی داشته باشیم. این بار از دومی استفاده می کنیم و یک دستور شرطی ساده می نویسیم. کد (Report_Card["Class"] == "A") یک شیء pandas.Series شامل مقادیر True و False را برمی گرداند که به نوبه خود برای نمایه سازی فریم داده اصلی ما استفاده می شود.

اکنون که دانش آموزان کلاس A را داریم، به برنامه ای برای بهبود عملکرد آنها نیاز داریم. بیایید نگاهی دقیق‌تر به دانش‌آموزانی بیندازیم که نمره‌شان کمتر از میانگین است، مثلاً 15 یا بیشتر.

می‌توانیم با فریم داده‌ class_A ای که ساخته‌ایم کار کنیم یا دو شرط زیر را با هم ترکیب کنیم و فریم داده دیگری ایجاد کنیم:

class_A_lower = Report_Card.loc[(Report_Card["Class"] == "A") & (Report_Card["Grades"] < 55)]

عملگر & در اینجا “AND منطقی” است، به این معنی که ما سطرهایی را می خواهیم که از کلاس A باشند و نمره آنها کمتر از 55 باشد. توجه به این نکته مهم است که هر دو شرطی که برای آنها از عملگر & استفاده می کنیم باید داخل پرانتز باشند. در غیر این صورت، پایتون کل عبارت را اشتباه تفسیر می‌کند و یک خطا ایجاد می‌شود. اگر به جای آن، به یک شرط یا شرط دیگر نیاز داشته باشیم، از عملگر |، معروف به “OR منطقی” استفاده می‌کنیم.

اکنون می‌توانیم تلاش خود را بر کمک به این دانش‌آموزان برای بهبود معدل کلاس A متمرکز کنیم.

ایجاد ستون های جدید و اعمال توابع

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

بیایید یک ستون جدید به فریم داده Grade_Report اضافه کنیم که نشان می دهد دانش آموز چند تکلیف اضافی را باید انجام دهد. از آنجایی که ما از قبل می دانیم که هر دانش آموز چند تکالیف اصلی را انجام داده است، می توانیم به کسانی که در انجام تکالیف اصلی خود کوتاهی کرده اند کمی بیشتر اضافه کنیم!

ابتدا یک تابع تکلیف بسیار ساده را تعریف می کنیم.

def extra_hw(homework):
if homework >= 2:
   return 2
elif homework == 0:
   return 6
else:
   return 4

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

با استفاده از فریم داده class_A_lower که قبلا ایجاد کردیم، به روز رسانی داده ها به این شکل است:

class_A_lower["Extra"] =
class_A_lower.apply(lambda row: extra_hw(row["Homework"]),axis=1)

این خط کد کمی دلهره آور به نظر می رسد، اما بسیار ساده است. ما از یکی از متد های pandas به نام ‎apply()‎ با یک lambda به عنوان آرگومان استفاده می کنیم. این تابع lambda از تابع ‎extra_hw()‎ ما در ستون Homework برای ایجاد مقادیر ستون جدید Extra برای هر سطر استفاده می کند. آرگومان اضافی axis=1 به این معنی است که ما این تابع لامبدا را به صورت ردیفی اعمال می کنیم. تابع ‎apply()‎ یک راه بسیار کارآمد برای اصلاح ردیف های قاب داده ما است و از چرخیدن در کل مجموعه با اختلاف خیلی بهتر عمل می کند.

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

Report_Card["Email"] = (Report_Card["Name"].str.‎lower()‎).str.replace(" ", ".") + '.' + (Report_Card["Class"].str.‎lower()‎) + "@school.edu"

هنگام اعمال توابع رشته ای به یک شیء pandas.Series، ابتدا باید از ویژگی str آن، برای دسترسی به مقدار رشته آن استفاده کنیم. کد بالا یک ستون به نام Email با ساختار ” name.middle.last_class@school.edu ” برای هر دانش آموز ایجاد می کند.

اگر در موقعیتی قرار بگیریم که فقط آدرس ایمیل دانش‌آموزان را داشته باشیم، می‌توانیم به راحتی آنها را با تجزیه آدرس ایمیل، دو ستون Name و Class را به دست آوریم:

Report_Card[["Name2","Class2"]] = Report_Card["Email"].str.split("@", n=1, expand=True)
Report_Card["Name2"] = (Report_Card["Name2"].str.replace("."," ")).str.capitalize()

شما اکنون اصول اولیه pandas را می دانید!

تبریک می گویم! شما اولین قدم خود را برای تسلط بر ماژول pandas در پایتون برداشته اید. بسیاری از عملکردهای چشمگیرتر نیز وجود دارد که می توانیم به آنها نگاهی بیندازیم، اما اینکار در این مقاله نمی گنجد و نیاز بحث های تکمیلی در مقالات جداگانه است.

از آنجایی که یاد گرفته اید چگونه داده ها را با استفاده از pandas پاکسازی و تجزیه و تحلیل کنید، گام منطقی بعدی این است که یاد بگیرید چگونه یافته های خود را ارائه دهید و به نمایش بگذارید. از آنجایی که شما اغلب یافته های خود را به افرادی بدون پیش زمینه برنامه نویسی ارائه می کنید، رویکرد بصری تری نیاز است. اگر به دنبال تقویت مهارت های تصویر سازی خود هستید، مقاله های مربوط به کتابخانه Matplotlib برای شما مناسب است. قسمت اول و دوم مباحث مقدماتی Matpotlib برای شروعی که برای ایجاد نمودارها و تصاویر خیره کننده نیاز دارید کافی است.

backendbaz

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*