کار کردن با داده های متنی در پایتون – راهنمای کاربردی


یکی از مهمترین کتابخانههای توسعه داده شده برای «زبان برنامهنویسی پایتون» (Python Programming Language)، کتابخانه Pandas است. کتابخانه نرمافزاری Pandas با هدف «دستکاری» (Manipulation) و «تحلیل» (Analysis) دادهها طراحی شده است. به طور خاص، این کتابخانه ساختارهای دادهای و توابع لازم برای دستکاری جداول عددی و «دادههای سری زمانی» (Time-Series) را تعریف میکند. یکی از مهمترین کاربردهای کتابخانه Pandas، پردازش داده های متنی در پایتون است.
یکی از ساختارهای دادهای تعریف شده در کتابخانه Pandas جهت کار کردن با داده های متنی در پایتون (و دیگر دادهها از جمله عددی)، آرایههایی به نام «سری» (Series) است. ساختارهای داده سری، یک آرایه یکبُعدی برچسبگذاری شده است که توانایی ذخیره انواع داده با نوعهای دادهای مختلف (دادههای از نوع integer ،string ،float ،python objects و سایر موارد) را دارد. به مجموعه «برچسبهای محوری» (Axis Labels)، «شاخص» (Index) گفته میشود (منظور، برچسبهایی که برای هر آرایه یکبُعدی یا همان ستونها در نظر گرفته میشود).
برای درک بهتر ساختارهای داده سری در Pandas، میتوانید آنها را مانند یک صفحه فایل «اکسل» (Excel) تصور کنید. لازم نیست که برچسبها یا شاخصهای ساختارهای داده سری یکتا باشند. با این حال، باید «قابل Hash شدن» (Hashable) باشند. به یک «شیء» (Object) خاص، شیء قابل Hash شدن گفته میشود اگر و تنها اگر مقدار Hash (یا Hash Value) در طول عمر این شیء هیچگاه تغییر نکند (به یک تابع ()__hash__ احتیاج است) و بتوان این شیء را با اشیاء دیگر مقایسه کرد (به یک تابع ()__eq__ احتیاج است).
ساختارهای داده سری، از شاخصگذاری مبتنی بر اعداد «صحیح» (Integer) و «برچسب» (Label) پشتیبانی میکند و مجموعه متنوعی از توابع، برای انجام عملیات و دستکاری داده های متنی در پایتون را با استفاده از شاخصها، در اختیار برنامهنویسان و توسعهدهندگان قرار میدهد.
توابع لازم برای دستکاری داده های متنی در پایتون
برای انجام عملیات روی داده های متنی در پایتون و دستکاری آنها، مجموعهای از توابع پردازش دادههای «رشته» (String) یا متدهای رشته در پایتون برای ساختارهای داده سری تعریف شده است. این توابع، به برنامهنویسان و توسعهدهندگان اجازه میدهند تا به راحتی روی هر کدام از عناصر آرایه عملیات انجام دهند. یکی از ویژگی مهم این توابع، حذف خودکار «دادههای گمشده یا از دست رفته» (Missing Values) از مجموعههای داده است.
تمامی توابع تعریف شده توسط کتابخانه Pandas جهت انجام عملیات روی داده های متنی، توسط کلمه کلیدی STR در پایتون قابل دسترسی هستند. به طور کلی، نام این توابع با نام توابع اصلی و «تعبیه شده» (Built-in) متناظر آنها در کتابخانه استاندارد زبان پایتون برابری میکند.
تابع ()str.lower
یکی از توابع تعریف شده توسط کتابخانه Pandas برای دستکاری داده های متنی در پایتون، تابع ()str.lower است. تابع ()str.lower، تمامی دادههای متنی را به حروف کوچک تبدیل میکند (Lowercase). به عبارت دیگر، این تابع تمامی کاراکترهای نوشته شده با حروف بزرگ (Uppercase) را به حروف کوچک (Lowercase) تبدیل میکند. در صورتی کاراکتر نوشته شده با حروف بزرگ، در متن یافت نشود، این تابع، داده متنی اصلی را به عنوان خروجی تولید میکند.
تابع ()str.upper
یکی دیگر از توابع تعریف شده برای کار کردن با داده های متنی در پایتون با استفاده از کتابخانه Pandas، تابع ()str.upper است. این تابع، بر خلاف تابع قبلی، تمامی دادههای متنی را به حروف بزرگ تبدیل میکند (Uppercase). به عبارت دیگر، این تابع تمامی کاراکترهای نوشته شده با حروف کوچک (Lowercase) را به حروف بزرگ (Uppercase) تبدیل میکند. در صورتی کاراکتر نوشته شده با حروف کوچک، در متن یافت نشود، این تابع، داده متنی اصلی را به عنوان خروجی تولید میکند.
خروجی:
Address Age Name Qualification 0 Delhi 27 jai Msc 1 Kanpur 24 princi MA 2 Allahabad 22 gaurav MCA 3 Kannauj 32 anuj Phd
همانطور که در خروجی بالا قابل مشاهده است (شکل بالا dataframe تولید شده توسط کتابخانه Pandas را نشان میدهد)، تمامی مقادیر موجود در ستون Name به مقادیر با حروف کوچک تبدیل شدهاند.
در مثال بعدی، از دادههای موجود در فایل [+] برای نمایش نحوه عملکرد تابع ()str.upper استفاده میشود.
خروجی:
همانطور که در شکل بالا قابل مشاهده است (dataframe تولید شده توسط کتابخانه Pandas)، تمامی دادههای متنی موجود در ستون Team به مقادیر متنی با حروف بزرگ تبدیل شدهاند.
تابع ()str.split
یکی دیگر از توابع تعریف شده برای دستکاری داده های متنی در پایتون و انجام عملیات رشتهای روی آنها، تابع ()str.split است. از این تابع، برای تکه تکه کردن یا جداسازی دادههای متنی به تعدادی «زیر رشته» (Substring) استفاده میشود. نحوه کار تابع ()str.split در کتابخانه Pandas بدین صورت است که پس از مشخص شدن یک رشته «جدا کننده» (Separator) یا «حائل» (Delimiter)، دادههای متنی بر اساس ظاهر شدن رشته جدا کننده یا حائل، به مجموعهای از زیررشتهها جداسازی میشود.
تابع ()split به طور پیش فرض در زبان برنامهنویسی پایتون تعریف شده است. با این حال، فرق اساسی این تابع با تابع ()str.split (در کتابخانه Pandas) این است که ()split تنها روی یک داده متنی (یک متغیر از نوع «رشته» (String)) عمل میکند، در حالی که تابع ()str.split، این توانایی را دارد که روی تمامی عناصر ساختارهای داده سری (Series) عملیات انجام دهد. پیشوند str. به مفسر پایتون اجازه میدهد تا میان تابع ()str.split و تابع ()split تمایز قائل شود و هنگام فراخوانی، تابع ()split مناسب را اجرا کند.
همانطور که پیش از این نیز اشاره شد، از تابع ()str.split برای تکه تکه کردن یا جداسازی دادههای متنی (string) در ساختارهای داده سری و شاخصهای آنها استفاده میشود. این تابع به محض ظاهر شدن رشته جدا کننده یا حائل، داده متنی را از هم جدا میکند. پارامترهای تابع ()str.split در کتابخانه Pandas به این صورت است:
(Series.str.split(self, pat=None, n=-1, expand=False
- پارامتر pat: رشته جدا کننده یا حائل را نمایش میدهد. یک رشته یا «عبارت منظم» (Regular Expression) است که با مشاهده آن، داده متنی به تعدادی زیر رشته تکه تکه یا جداسازی میشود. در صورتی که این پارامتر برای تابع مشخص نشود، تابع به طور خودکار، دادههای متنی موجود در ساختارهای داده سری و شاخصهای آنها را بر اساس «فضای خالی» (Whitespace) جداسازی میکند.
- پارامتر n: مقداری صحیح است و تعداد خروجیهای حاصل از عملیات جداسازی دادههای متنی را کنترل میکند.
خروجی:
Address Age Name Qualification 0 N 27 Jai Msc 1 K 24 Princi MA 2 All 22 Gaurav MCA 3 Knnu 32 Anuj Phd
همانطور که در خروجی نمایش داده شده مشخص است، از آنجایی که مقدار پارامتر n برابر با 1 در نظر گرفته شده است، ستون Address در ساختارهای داده سری، تنها بر اساس اولین ظاهر شدن حرف a جداسازی میشود و نه بر اساس دیگر دفعات ظاهر شدن این حرف. به عبارت دیگر، با در نظر گرفتن مقدار 1 برای پارامتر n، حداکثر یک جداسازی در دادههای متنی رخ خواهد داد.
تابع ()str.replace
یکی دیگر از توابع تعریف شده برای دستکاری داده های متنی و انجام عملیات رشتهای روی آنها، متد Replace در پایتون است. از این تابع، برای جایگزین کردن دادههای متنی استفاده میشود. این تابع، همانند تابع پیشفرض ()replace در زبان پایتون عمل میکند، با این تفاوت که علاوه بر اینکه میتواند روی یک داده متنی (یک متغیر از نوع «رشته» (String)) عمل کند، این قابلیت را نیز دارد که روی ساختارهای داده سری و شاخصهای آنها نیز عملیات جایگزین کردن را انجام دهد. پیشوند str. به مفسر پایتون اجازه میدهد تا میان تابع ()str.replace و تابع ()replace تمایز قائل شود و هنگام فراخوانی، تابع ()replace مناسب را اجرا کند.
خروجی:
همانطور که در خروجی نمایش داده شده در شکل بالا مشخص است، تمامی مقادیر موجود در ستون Age که مقدار age=25.0 دارند یا رشته Twenty five جایگزین شدهاند.
الحاق (Concatenation) دادههای متنی
یکی از توابع مفید تعریف شده برای دستکاری داده های متنی در پایتون و انجام عملیات رشتهای روی آنها، تابع ()str.cat است. از این تابع، برای الحاق (عناصر) یک آرایه متشکل از دادههای متنی (آرگومان ورودی تابع ()str.cat) به (عناصر) یک شاخص (index) یا ستون تعریف شده در ساختار داده سری استفاده میشود. به عبارت دیگر، شاخص (index) یا ستون ساختار داده سری (که حاوی دادههای متنی است)، تابع ()str.cat را فراخوانی میکند و در نتیجه این فراخوانی، آرایه متشکل از دادههای متنی به آرایه یا شاخص فراخواننده تابع الحاق میشود.
نکته مهمی که هنگام استفاده از این تابع باید به آن اشاره شود این است که باید طول آرایه و طول شاخص یا ستون ساختار داده سری با یکدیگر برابر باشد؛ در غیر این صورت منجر به بروز خطا خواهد شد.
خروجی:
Address Age Name Qualification 0 Nagpur 27 Jai, Nagpur Msc 1 Kanpur 24 Princi, Kanpur MA 2 Allahabad 22 Gaurav, Allahabad MCA 3 Kannuaj 32 Anuj, Kannuaj Phd
همانطور که در خروجی نمایش داده شده مشخص است، مقادیر دادهای موجود در ستون Address، نظیر به نظیر، به مقادیر متناظر آنها در ستون Name الحاق میشوند. در هنگام الحاق مقادیر دو ستون، از جدا کننده ( “ ,“) برای فاصله انداختن میان مقادیر الحاق شده به یکدیگر استفاده میشود.
خروجی:
همانطور که در خروجی نمایش داده شده در شکل مشخص است، مقادیر دادهای موجود در ستون Team، نظیر به نظیر، به مقادیر متناظر آنها در ستون Name الحاق میشوند. هنگام الحاق مقادیر دو ستون، از جدا کننده ( “ ,“) برای فاصله انداختن میان مقادیر الحاق شده به یکدیگر استفاده میشود.
حذف کردن فضاهای خالی (Whitespaces) از داده های متنی در پایتون
دستهای دیگر از توابع که برای دستکاری داده های متنی در پایتون و انجام عملیات رشتهای روی آنها مورد استفاده قرار میگیرند، توابع ()str.lstrip() ،str.strip و ()str.rstrip هستند. از این دسته از توابع، برای حذف کردن فضاهای خای در دادههای متنی (نظیر Newline) استفاده میشود.
همانطور که نام این توابع نیز گویا است، از تابع ()str.lstrip برای حذف کردن فضاهای خالی از سمت چپ رشته متنی، از تابع ()str.rstrip برای حذف کردن فضاهای خالی از سمت راست رشته متنی و از تابع ()str.strip برای حذف کردن فضاهای خالی از دو طرف رشته متنی استفاده میشود.
از آنجایی که این توابع، توابع تعریف شده توسط کتابخانه Pandas هستند و برای پردازش داده های متنی در پایتون مورد استفاده قرار میگیرند، هنگام فراخوانی آنها باید پیشوند str. به کار گرفته شود. پیشوند str. برای مفسر پایتون مشخص میکند که توابع Pandas باید فراخوانی شوند و نه توابع اصلی و تعبیه شده زبان پایتون.
خروجی:
Address Age Name Qualification 0 Nagpur junction 27 Jai Msc 1 Kanpur junction 24 Princi MA 2 Nagpur junction 22 Gaurav MCA 3 Kannuaj junction 32 Anuj Phd Address Age Name Qualification 0 Nagpur junction 27 Jai Msc 1 Kanpur junction 24 Princi MA 2 Nagpur junction 22 Gaurav MCA 3 Kannuaj junction 32 Anuj Phd 0 False 1 False 2 False 3 False Name: Address, dtype: bool 0 False 1 False 2 False 3 False Name: Address, dtype: bool 0 False 1 False 2 False 3 False Name: Address, dtype: bool
همانطور که در خروجیهای نمایش داده شده مشخص است، نتیجه سه مقایسه انجام شده در انتهای قطعه، برای تمامی حالات False است؛ یعنی، تمامی فضاهای خالی (در این قطعه کد، از Space به عنوان فضای خالی استفاده شده است) با موفقیت از دو طرف رشتههای متنی موجود در ساختار داده سری حذف شده است. به عبارت دیگر، هیچ فضای خالی در رشتههای متنی وجود ندارد.
خروجی:
استخراج داده های متنی در پایتون
جهت استخراج داده از ساختار داده سری، از تابع ()str.extract استفاده میشود. این تابع، یک عبارت منظم با حداقل یک ساختار کنترلی را به عنوان آرگومان ورودی میپذیرد. در صورتی که بیش از یک ساختار کنترلی در عبارت منظم تعریف شود، یک DataFrame خروجی داده میشود که هر ستون آن نمایش دهنده دادههای استخراج شده به ازای هر کدام از ساختارهای کنترلی است. عناصری که با ساختارهای کنترلی در عبارت منظم مطابقت نداشته باشند، به جای آنها در خروجی، یک سطر حاوی مقادیر NaN تولید میشود.
خروجی:
0 1 0 a 1 1 b 2 2 NaN NaN
همانطور که در خروجی بالا مشهود است، از آنجایی که در قطعه کد بالا دو ساختار کنترلی ([ab]) و (d\) تعریف شده است (با استفاده از ساختار اول، یکی از حروف a یا b را در ساختار داده استخراج میکند و از ساختار دوم برای استخراج اعداد از ساختار داده سری استفاده میشود)، بنابراین، یک Dataframe متشکل از دو ستون در خروجی نمایش داده خواهد شد. عناصری که با ساختارهای کنترلی مطابقت نداشته باشند، با مقادیر NaN پر میشوند.
خروجی:
letter Digit 0 a 1 1 b 2 2 NaN NaN
همانطور که در خروجی بالا مشهود است، از قطعه کد بالا برای نامدهی به ستونهای نمایش داده شده در خروجی استفاده میشود.
توابع str تعریف شده در کتابخانه Pandas جهت پردازش داده های متنی در پایتون
در این بخش، توابع str تعریف شده در کتابخانه Pandas جهت پردازش داده های متنی در پایتون مورد بررسی قرار میگیرند و کاربرد آنها معرفی میشود.
نام تابع | توصیف تابع |
()str.lower | از این تابع، برای تبدیل کاراکترهای یک رشته متنی به حروف کوچک استفاده میشود. |
()str.upper | از این تابع، برای تبدیل کاراکترهای یک رشته متنی به حروف بزرگ استفاده میشود. |
()str.find | از این تابع، برای جستجوی یک زیر رشته در تمامی رشتههای موجود در ساختار داده سری استفاده میشود. |
()str.rfind | از این تابع، برای جستجوی (از سمت راست) یک زیر رشته در تمامی رشته موجود در ساختار داده سری استفاده میشود. |
()str.findall | از این تابع، برای جستجوی زیر رشتهها یا جدا کنندهها (Separators) در تمامی رشتههای موجود در ساختار داده سری استفاده میشود. |
()str.isalpha | با استفاده از این تابع، مشخص میشود که آیا تمامی کاراکترهای رشتههای موجود در ساختار داده سری، الفبایی هستند یا نه؟ |
()str.isdecimal | با استفاده از این تابع، مشخص میشود که آیا تمامی کاراکترهای موجود در یک رشته، عدد هستند یا نه؟ |
()str.title | از این تابع، برای بزرگ کردن اولین حرف هر کدام از کلمات موجود در یک داده متنی استفاده میشود. |
()str.len | با استفاده از این تابع، تعداد کاراکترهای موجود در یک رشته (داده متنی) محاسبه میشود. |
()str.replace | با استفاده از این تابع، یک زیر رشته موجود در رشته متنی، با مقدار دیگری که توسط کاربر فراهم میشود، جایگزین میشود. |
()str.contains | با استفاده از این تابع، مشخص میشود که آیا یک الگو یا عبارت منظم، درون دادههای متنی یک داده سری یا شاخصهای آن یافت میشود یا نه. |
()str.extract | با استفاده از این تابع، مجموعه کاراکترهایی که با یک عبارت منظم و ساختارهای کنترلی آن مطابقت دارند، بازیابی میشود. |
()str.startswith | با استفاده از این تابع، مشخص میشود که آیا ابتدای یک رشته یا داده متنی، با یک الگو یا عبارت منظم مطابقت دارد یا نه. |
()str.endswith | با استفاده از این تابع، مشخص میشود که آیا انتهای یک رشته یا داده متنی، با یک الگو یا عبارت منظم مطابقت دارد یا نه. |
()str.isdigit | با استفاده از این تابع، مشخص میشود که آیا تمامی کاراکترهای رشتههای موجود در یک داده سری، عدد هستند یا نه. |
()str.lstrip | از این تابع، برای حذف فاصلههای خالی، از سمت چپ یک رشته (از ابتدای رشته) استفاده میشود. |
()str.rstrip | از این تابع، برای حذف فاصلههای خالی، از سمت راست یک رشته (از انتهای رشته) استفاده میشود. |
()str.strip | از این تابع، برای حذف فاصلههای خالی، از هر دو سمت (راست و چپ) یک رشته استفاده میشود |
()str.split | با استفاده از این تابع، رشته یا داده متنی، بر اساس مشاهده یک زیر رشته یا الگوی تعریف شده توسط کاربر، جداسازی (تکه تکه) میشود. |
()str.join | با استفاده از این تابع و با در اختیار داشتن یک حائل (Delimiter)، عناصر یک لیست موجود در دادههای سری به یکدیگر متصل میشوند. |
()str.cat | از این تابع، برای الحاق یک آرایه متشکل از دادههای متنی به یک شاخص یا داده سری فراخواننده تابع استفاده میشود. |
()str.repeat | از این تابع، برای تکرار کردن مقادیر (یک آرایه) رشتهای، در مکان متناظر آنها در یک داده سری دیگر استفاده میشود. |
()str.get | از این تابع، برای واکشی دادههای متنی، در مکان خاصی از دادههای سری، استفاده میشود. |
()str.partition | این تابع برخلاف تابع split، دادههای متنی را تنها در اولین ظاهر شدن رشته حائل جداسازی میکند. |
()str.pad | از این تابع، میتوان برای اضافه کردن Padding (فضاهای خالی یا کاراکترهای دیگر) به هریک از عناصر دادههای سری استفاده کرد. |
()str.swapcase | با استفاده از این تابع، حروف کوچک به حروف بزرگ و برعکس تبدیل میشوند. |
مجموعه آموزشهای مرتبط با زبان برنامهنویسی پایتون که در مجله فرادرس تهیه شدهاند و برای عموم مخاطبان و خوانندگان در دسترس قرار گرفتهاند، در اینجا گردآوری شدهاند. در صورتی که تمایل دارید با زبان برنامهنویسی پایتون و نحوه کدنویسی در این زبان آشنا شوید، توصیه میشود که آموزشهای ارائه شده در این مطب را مطالعه کنید.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون Python
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- مجموعه آموزشهای برنامهنویسی
- زبان برنامه نویسی پایتون (Python) — از صفر تا صد
- ترفندهای برنامه نویسی در پایتون — از صفر تا صد
- پایتون یا جاوا کدام بهتر است؟ — راهنمای جامع
- آموزش پایتون (Python) — مجموعه مقالات جامع وبلاگ فرادرس
^^