کار با داده های متنی در پایتون
کار با داده های متنی در پایتون
آرایه سری/Series جزئی از ساختارهایی است که در کتابخانه پانداس تعریف شده است تا بتوان به وسیله آن داده های متنی در پایتون را مورد بررسی قرار داد و روی آنها تغییرات لازم را ایجاد نمود. دادههای سری ساختاری دارند که به شکل یک آرایه یک بعدی نشانه گذاری شده و انواع دادههای مختلف مثل integer ،string ،float ،python objects را می توانند ذخیره سازی نمایند.
Axis Labels Index به برچسب هایی گفته میشود که برای ستونها یا همان آرایههای یک بعدی در نظر گرفته میشوند.
حتماً نباید شاخصهای مربوط به ساختارهای داده سری به صورت یونیک و یکتا باشند حتی برای فهم صریحتر و بهتر ساختار داده در پانداس میتوان آن را مانند یک صفحه اکسل در نظر گرفت، البته این دادهها باید قابل Hash شدن باشند.
به یک Object خاص، شیء قابل هش شدن گفته میشود اگر و تنها اگر مقدار Hash در طول عمر این شیء هیچگاه تغییر نکند (به یک تابع ()__hash__ احتیاج است) ولی اگر بتوان این شیء را با اشیاء دیگر مقایسه نمود (به یک تابع ()__eq__ احتیاج است).
دادههای سری ساختاری دارند که از شاخص گذاری برچسب و اعداد صحیح پشتیبانی نموده و برای دستکاری کردن داده های متنی در پایتون یا انجام عملیات روی آنها توابع متنوعی را ارائه نموده است، تمام این ویژگی ها در اختیار توسعه دهندگان علم برنامه نویسی قرار دارند.
توابع لازم برای دستکاری داده های متنی در پایتون
دادهها در پایتون انواع مختلفی دارند که برای ایجاد تغییرات لازم روی هر یک از آنها باید از توابع مناسبی استفاده شود، جهت ویراش داده های متنی در پایتون در ساختارهای داده سری از مجموعه توابع پردازش داده های string یا همان رشتهای استفاده میشود. بدین وسیله توسعه دهندگان میتوانند روی عناصر مختلف آرایه تغییرات لازم را ایجاد کنند. به عنوان یکی از ویژگیهای مهم این تابع میتوان به حذف کردن اتوماتیک missing values از مجموعه داده ها اشاره کرد.
انجام عملیات روی داده های متنی در پایتون و دستکاری آنها، به وسیله مجموعهای از توابع پردازش دادههای «رشته» (String) که برای ساختارهای داده سری تعریف شده است، به انجام میرسد.
کتابخانه پانداس توابع مختلفی دارد که میتوان از آنها برای ایجاد تغییر و انجام عملیات مختلف روی داده های رشتهای یا همان متنی به وسیله دستور str استفاده نمود. در مجموع نام این توابع با نام توابع اصلی و ساخته شده و متناظر آنها در کتابخانه زبان پایتون که یک تعریف استاندارد دارد، مطابقت میکند.
تابع ()str.lower
تابع ()str.lower جزوه پرکاربردترین توابع مربوط به دادههای متنی در پایتون و در کتابخانه پانداس است که جهت ویرایش داده های متنی در پایتون به کار گرفته میشود. این تابع دادههایی با حروف بزرگ را به حروف کوچک تبدیل میکند یا به زبان دیگر میتوان گفت که دادههای Uppercase به Lowercase تبدیل میشوند. اگر حروف بزرگی در متن مورد نظر یافت نشود تابع نام برده شده به عنوان خروجی متن اورجینال را تولید مینماید.
تابع ()str.upper
در پانداس توابع مختلفی وجود دارند که یکی دیگر از توابع مربوط به داده های متنی در پایتون تابع ()str.upper میباشد. و وظیفه آن دقیقاً برعکس تابع قبلی است یعنی دادههای موجود در متن را بررسی کرده و حروف کوچک موجود در متن را به Uppercase تبدیل مینماید. همانطور که در توضیحات قبل نیز بیان شد در صورتی که هیچ حرف یا کاراکتر کوچکی در متن پیدا نشود این تابع متن اصلی را در خروجی نمایش میدهد و تغییری روی آن ایجاد نمیکند.
# Import pandas package
import pandas as pd
# Define a dictionary containing employee data
data = {‘Name’:[‘Jai’, ‘Princi’, ‘Gaurav’, ‘Anuj’],
‘Age’:[27, 24, 22, 32],
‘Address’:[‘Delhi’, ‘Kanpur’, ‘Allahabad’, ‘Kannauj’],
‘Qualification’:[‘Msc’, ‘MA’, ‘MCA’, ‘Phd’]}
# Convert the dictionary into DataFrame
df = pd.DataFrame(data)
# converting and overwriting values in column
df[“Name”]= df[“Name”].str.lower()
print(df)
خروجی:
Address Age Name Qualification
۰ Delhi 27 jai Msc
۱ Kanpur 24 princi MA
۲ Allahabad 22 gaurav MCA
۳ Kannauj 32 anuj Phd
با توجه به مثال فوق میتوانید مشاهده کنید که دیتا فریم تولید شده توسط کتابخانه پانداس مقادیر موجود در ستون نام را تبدیل به حروف کوچک نموده و آن را در خروجی نمایش داده است در ادامه توجه شما را به مثال دیگری از تابع ()str.upper جلب مینمایم؛
# importing pandas package
import pandas as pd
# making data frame from csv file
data = pd.read_csv(“nba.csv”)
# converting and overwriting values in column
data[“Team”]= data[“Team”].str.upper()
# display
data
خروجی:
به طور واضح مشخص است که داده های ستون Team در دیتا فریم تولید شده توسط کتابخانه پانداس تبدیل به حروف بزرگ شدهاند و این ویژگی هنگام کار با داده های متنی در پایتون برای توسعه دهندگان کاربردهای متنوعی خواهد داشت.
تابع ()str.split
تابع ()str.split تابع دیگری از توابع مربوط به داده های متنی در پایتون است که برای ادیت، دستکاری و انجام عملیات روی رشته ها مورد استفاده قرار میگیرد، همچنین برای ایجاد زیر رشته یا به اصطلاح جداسازی دادههای رشتهای میتوان از این تابع استفاده نمود.
نحوه کار با این تابع در کتابخانه پانداست به این شکل است که بعد از مشخص شدن رشته جداکننده، دادهها طبق ظاهر شدن رشته جداکننده تبدیل به Substring شده و از یکدیگر جدا میشوند.
()str.split و ()split هر دو از توابعی هستند که به صورت پیش فرض در پایتون تعریف شدهاند. اما ()split فقط روی یک داده متنی عمل میکند از طرفی برتری تابع دیگر در این ویژگی است که()str.split قابلیت این را دارد که روی همه عناصر ساختارهای داده سری به انجام عملیات بپردازد.
پیشوند str. به مفسر پایتون اجازه میدهد تا میان تابع ()str.split و تابع ()split تمایز قائل شود و هنگام فراخوانی، تابع ()split مناسب را اجرا کند.
با توجه به توضیحات فوق میدانید که تابع ()str.split جهت جداسازی دادههای رشته ای در ساختارهای داده سری و شاخصهای آن مورد استفاده قرار میگیرد و میتواند دادههای متنی را جدا سازی کند. به محض آنکه این تابع رشته مورد نظر را شناسایی کند به انجام عملیات برای جدا کردن متن ها از یکدیگر میپردازد.
تابع ()str.split پارامترهایی دارد که به صورت زیر تعریف میشوند؛
(Series.str.split(self, pat=None, n=-1, expand=False
۱٫ پارامتر pat جهت نمایش دادن رشته جدا کننده یا حائل مورد استفاده قرار می گیرد. Pat یک رشته یا «عبارت منظم» (Regular Expression) است، یعنی وقتی آن را مشاهده میکنیم میدانیم که دادههای متنی به زیر رشتههای مختلفی تقسیم بندی شده و به اصطلاح جداسازی میشوند اما اگر پارامتر مشخصی را برای این تابع تعریف نکنیم، خود به صورت اتوماتیک ورودی های متنی که در ساختار داده سری و شاخص آنها وجود دارند را طبق فضای خالی یا Whitespace جداسازی میکند.
۲٫ پارامترn مقداری است از نوع صحیح، که تعداد خروجیهای حاصل شده از جداسازی داده های متنی در پایتون را شمارش و کنترل مینماید.
# importing pandas module
import pandas as pd
# Define a dictionary containing employee data
data = {‘Name’:[‘Jai’, ‘Princi’, ‘Gaurav’, ‘Anuj’],
‘Age’:[27, 24, 22, 32],
‘Address’:[‘Nagpur’, ‘Kanpur’, ‘Allahabad’, ‘Knnuaj’],
‘Qualification’:[‘Msc’, ‘MA’, ‘MCA’, ‘Phd’]}
# Convert the dictionary into DataFrame
df = pd.DataFrame(data)
# dropping null value columns to avoid errors
df.dropna(inplace = True)
# new data frame with split value columns
df[“Address”]= df[“Address”].str.split(“a”, n = 1, expand = True)
# df display
print(df)
خروجی:
Address Age Name Qualification
۰ N 27 Jai Msc
۱ K 24 Princi MA
۲ All 22 Gaurav MCA
۳ Knnu 32 Anuj Phd
در مثال فوق با توجه به خروجی مشخص است که مقدار پارامتر n عدد ۱ میباشد و ستون Address در ساختارهای داده سری، تنها بر اساس اولین ظاهر شدن حرف a جداسازی شدهاند و نه بر اساس دیگر دفعات ظاهر شدن حرف n.
میتوان نتیجه گرفت که اگر برای پارامتر n عدد ۱ در نظر گرفته شود پس حداکثر یک جداسازی در دادههای متنی به وقوع می پیوندد.
تابع ()str.replace
تابع ()str.replace جزو یکی دیگر از از توابع از پیش تعریف شده برای ویرایش داده های متنی در پایتون میباشد که از آن برای جایگزینی استفاده میشود یعنی میتوان یک داده متنی را با دیگری جایگزین نمود.
تابع ()replace نیز به صورت پیش فرض در پایتون تعریف شده است اما تفاوت این تابع با تابع ()str.replace این است که فقط میتواند روی یک داده متنی از نوع استرینگ عمل کند اما پیشوند str. به مفسر پایتون این قابلیت را میدهد که روی ساختارهای داده سری و شاخصهای آن نیز به انجام عملیات جایگزینی بپردازد.
# importing pandas module
import pandas as pd
# reading csv file from url
data = pd.read_csv(“nba.csv”)
# overwriting column with replaced value of age
data[“Age”]= data[“Age”].replace(25.0, “Twenty five”)
# creating a filter for age column
# where age = “Twenty five”
filter = data[“Age”]==”Twenty five”
# printing only filtered columns
data.where(filter).dropna()
خروجی:
با توجه به مثال فوق می توانید ببینید که در خروجی همه مقادیری که در ستون Age قرار داشتند و مقدار آنها برابر با age=25.0 بود با رشته Twenty five جایگزین شدهاند.
الحاق (Concatenation) دادههای متنی
برای انجام عملیات روی داده های متنی در پایتون توابع مختلفی تعریف شده است که تا به اینجا تعدادی از آنها را نام برده ایم یکی دیگر از توابع مفید برای انجام عملیات روی رشته ها و متن های مختلف تابع ()str.cat است که کاربرد آن الحاق یا به هم چسباندن عناصر مختلف موجود در یک آرایه که از داده های متنی تشکیل شده است، میباشد.
طبق این روال عناصر آرایه یا همان آرگومانهای ورودی تابع ()str.cat در (عناصر) یک شاخص یا ستون تعریف شده به ساختار داده سری الحاق میشود.
فقط یک نکته وجود دارد که هنگام استفاده از این تابع رعایت آن الزامی است و آن این است که طول شاخص یا همان ستون ساختار داده سرویس باید با طول آرایه برابر باشد تا خطایی صورت نگیرد.
# importing pandas module
import pandas as pd
# Define a dictionary containing employee data
data = {‘Name’:[‘Jai’, ‘Princi’, ‘Gaurav’, ‘Anuj’],
‘Age’:[27, 24, 22, 32],
‘Address’:[‘Nagpur’, ‘Kanpur’, ‘Allahabad’, ‘Kannuaj’],
‘Qualification’:[‘Msc’, ‘MA’, ‘MCA’, ‘Phd’]}
# Convert the dictionary into DataFrame
df = pd.DataFrame(data)
# making copy of address column
new = df[“Address”].copy()
# concatenating address with name column
# overwriting name column
df[“Name”]= df[“Name”].str.cat(new, sep =”, “)
# display
print(df)
خروجی:
Address Age Name Qualification
۰ Nagpur 27 Jai, Nagpur Msc
۱ Kanpur 24 Princi, Kanpur MA
۲ Allahabad 22 Gaurav, Allahabad MCA
۳ Kannuaj 32 Anuj, Kannuaj Phd
با توجه به مثال فوق مشاهده میکنید که مقادیر دادهای موجود در خروجی که در ستون آدرس و نام وجود دارند به صورت نظیر به نظیر به یکدیگر الحاق شدهاند. (توجه کنید که هنگام الحاق مقادیر دو ستون، از جدا کننده ( “ ,“) برای فاصله انداختن میان مقادیر الحاق شده به یکدیگر استفاده میشود .)
# importing pandas module
import pandas as pd
# importing csv from link
data = pd.read_csv(“nba.csv”)
# making copy of team column
new = data[“Team”].copy()
# concatenating team with name column
# overwriting name column
data[“Name”]= data[“Name”].str.cat(new, sep =”, “)
# display
خروجی:
به خروجی مثال فوق توجه کنید همانطور که مشخص است دادههای موجود در ستون تیم به صورت نظیر به نظیر به مقادیر موجود در ستون نام الحاق شدهاند و همان طور که گفته شد برای جدا کردن آنها و ایجاد فاصله میان مقادیر الحاق شده از علامت( “ ,“) استفاده شده است.
حذف کردن فضاهای خالی (Whitespaces) از داده های متنی در پایتون
توابع دیگری برای دستکاری داده های متنی در پایتون و ایجاد تغییرات لازم روی رشتهها وجود دارند که توابع ()str.lstrip() ،str.strip و ()str.rstrip نیز جزوی از آنها هستند. برای برای حذف کردن فضای خالی موجود میان داده های متنی از توابع نامبرده شده استفاده میشود.
مثلا تابع ()str.lstrip تابعی است که فضای خالی را از سمت چپ رشته متنی حذف میکند و تابع ()str.rstrip به حذف کردن فضای خالی میان یک رشته متنی از سمت راست می پردازد، همچنین تابع ()str.strip قابلیت حذف کردن فضای خالی موجود در یک رشته متنی از دو طرف را دارا میباشد.
تمامی توابع فوق در کتابخانه پانداس تعریف شدهاند و برای انجام عملیات پردازشی روی داده های متنی در پایتون و در کتابخانه پانداس مورد استفاده قرار میگیرند. به همین دلیل برای فرا خواندن آنها باید به استفاده از پیشوند str. پرداخته شود تا مفسر پایتون تشخیص دهد که باید توابع پانداس را صدا بزند، در غیر این صورت توابع تعبیه شده برای زبان پایتون فراخوانی خواهند شد.
# importing pandas module
import pandas as pd
# Define a dictionary containing employee data
data = {‘Name’:[‘Jai’, ‘Princi’, ‘Gaurav’, ‘Anuj’],
‘Age’:[27, 24, 22, 32],
‘Address’:[‘Nagpur junction’, ‘Kanpur junction’,
‘Nagpur junction’, ‘Kannuaj junction’],
‘Qualification’:[‘Msc’, ‘MA’, ‘MCA’, ‘Phd’]}
# Convert the dictionary into DataFrame
df = pd.DataFrame(data)
# replacing address name and adding spaces in start and end
new = df[“Address”].replace(“Nagpur junction”, ” Nagpur junction “).copy()
# checking with custom string
print(new.str.strip()==” Nagpur junction”)
print(new.str.strip()==”Nagpur junction “)
print(new.str.strip()==” Nagpur junction “)
خروجی:
Address Age Name Qualification
۰ Nagpur junction 27 Jai Msc
۱ Kanpur junction 24 Princi MA
۲ Nagpur junction 22 Gaurav MCA
۳ Kannuaj junction 32 Anuj Phd
Address Age Name Qualification
۰ Nagpur junction 27 Jai Msc
۱ Kanpur junction 24 Princi MA
۲ Nagpur junction 22 Gaurav MCA
۳ Kannuaj junction 32 Anuj Phd
۰ False
۱ False
۲ False
۳ False
Name: Address, dtype: bool
۰ False
۱ False
۲ False
۳ False
Name: Address, dtype: bool
۰ False
۱ False
۲ False
۳ False
Name: Address, dtype: bool
با توجه به خروجی نمایش داده شده در مثال فوق میبینیم که نتیجه مقایسات انجام شده در آخر قطعه برای همه حالت ها False است و این یعنی همه فضاهای خالی از دو طرف رشته متنی که در ساختار داده سری وجود دارند، با موفقیت حذف شدهاند و هیچ فضای خالی دیگری در رشته وجود ندارد (در این قطعه کد، از Space به عنوان فضای خالی استفاده شده است)
# importing pandas module
import pandas as pd
# making data frame
data = pd.read_csv(“nba.csv”)
# replacing team name and adding spaces in start and end
new = data[“Team”].replace(“Boston Celtics”, ” Boston Celtics “).copy()
# checking with custom removed space string
new.str.lstrip()==”Boston Celtics “
خروجی:
استخراج داده های متنی در پایتون
تابع ()str.extract تابعی مناسب برای استخراج داده ها از ساختار داده سری میباشد که در کمترین حالت یک ساختار کنترلی را تحت عنوان آرگومان ورودی قبول میکند و اگر بیشتر از یک ساختار کنترلی به صورت منظم تعریف شده باشد دیتا فریمی در خروجی نمایش داده میشود که متشکل از ستونهایی با دادههای استخراج شده به ازای هر یک از ساختارهای کنترلی میباشد.
در خروجی به جای عناصری که با ساختارهای کنترلی در عبارت منظم مطابقت نداشته باشند، یک سطر حاوی مقادیر NaN تولید خواهد شد.
# importing pandas module
import pandas as pd
# creating a series
s = pd.Series([‘a1’, ‘b2’, ‘c3’])
# Extracting a data
n= s.str.extract(r'([ab])(\d)’)
print(n)
خروجی:
۰ ۱
۰ a 1
۱ b 2
۲ NaN NaN
در قسمت خروجی مثال فوق مشخص است که دو ساختار کنترلی ([ab]) و (d\) تعریف شدهاند که ساختار اول برای استخراج یکی از حروف a یا b تعریف شده است و ساختار دوم برای استخراج اعداد از ساختار داده سری تعریف شده است.
به همین دلیل دیتا فریم فوق از دو ستون خروجی تشکیل شده است و اگر عنصرها با ساختارهای کنترلی تطبیق نداشته باشند بی شک با مقادیر NaN پر میشوند.
# importing pandas module
import pandas as pd
# creating a series
s = pd.Series([‘a1’, ‘b2’, ‘c3’])
# Extracting a data
n = s.str.extract(r'(?P<letter>[ab])(?P<Digit>\d)’)
print(n)
خروجی:
letter Digit
۰ a 1
۱ b 2
۲ NaN NaN
احتمالا متوجه شده اید که در خروجی فوق با توجه به کدهای نوشته شده برای ستون های نمایش داده شده نام هایی در نظر گرفته که شده است.
توابع str تعریف شده در کتابخانه Pandas جهت داده های متنی در پایتون
اگر مطالب موجود در این مقاله را به خوبی مطالعه کرده باشید با توابع مختلفی آشنا شدهاید که جهت انجام عملیات روی داده های متنی در پایتون مورد استفاده قرار میگیرند.
در مجموع توابع str که در کتابخانه پانداس تعریف شدهاند، برای پردازش داده های متنی در پایتون مورد استفاده قرار گرفته و هر یک کاربرد منحصر به فردی دارند که خلاصه آن به شرح زیر میباشد؛
نام و توصیف توابع
()str.lower این تابع کاراکترهای موجود در یک رشته متنی را تبدیل به حروف کوچک می نماید.
()str.upper این تابع کاراکترهای موجود در یک رشته متنی را به حروف بزرگ تبدیل می نماید.
()str.find این تابع تمام رشته های موجود در ساختار داده سری را بررسی میکند تا زیر رشته مورد نظر را پیدا کند.
()str.rfind این تابع تمام رشته های موجود در ساختار داده سری را بررسی می کند تا زیر رشته موردنظر را پیدا کند و نکته اینجاست که جستجو از سمت راست آغاز می شود.
()str.findall این تابع تمام رشته های موجود در ساختار داده سری را بررسی می کند تا زیر رشته ها یا جداکننده ها را پیدا نماید.
()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 این تابع برای متصل کردن عناصر موجود در لیست داده های سری با استفاده از یک حائل مورد استفاده قرار میگیرد.
()str.cat این تابع داده های متنی موجود در یک آرایه را به شاخص یا داده سری فراخواننده تابع الحاق میکند.
()str.repeat این تابع مقادیر رشته های یک آرایه را به صورت نظیر به نظیر مکان دیگری از دادههای سری تکرار میکند.
()str.get ازاین تابع داده های متنی را در محل مشخصی از داده های سری واکشی میکند.
()str.partition این تابع برخلاف تابع split، دادههای متنی را تنها در اولین ظاهر شدن رشته حائل جداسازی میکند.
()str.pad این تابع جهت افزودن یک یا چند کاراکتر یا حتی فضای خالی بین عناصر موجود در داده های سری مورد استفاده قرار میگیرد.
()str.swapcase این تابع حروف کوچک را به حروف بزرگ و حروف بزرگ را به حروف کوچک تبدیل میکند.