می خواهید پاکسازی داده را با پانداس یاد بگیرید؟ این آموزش به شما هر آنچه را که نیاز دارید، یاد میدهد.
پانداس یک کتابخانه از پایتون است که به طور گسترده برای تجزیه و تحلیل و دستکاری داده استفاده میشود. اما دادههایی که شما از منبع میخوانید اغلب قبل از اینکه بتوانید آنها را برای به دست آوردن بینش (نگرش)، پاسخ به سوالات تجاری یا ساخت مدلهای یادگیری ماشین تجزیه و تحلیل کنید، نیاز به یک سری مراحل پاکسازی داده دارد. این راهنما فرآیند پاکسازی داده با پانداس را به 7 مرحله عملی تقسیم میکند. ما یک نمونه دیتاست را ایجاد میکنیم و مراحل پاکسازی داده را طی خواهیم نمود.
اگر قصد داری یک دوره کاملن رایگان دیتاساینس رو دنبال کنی، برو داخل این لینک.
ایجاد یک دیتافریم نمونه
قبل از شروع مراحل پاکسازی داده، یک دیتافریم (DataFrame) پانداس با رکوردهای کارمند ایجاد میکنیم. از کتابخانه Faker برای تولید دادههای ساختگی استفاده خواهیم کرد. پس ابتدا آن را نصب کنید. برای نصب به خط فرمان رفته و دستور زیر را وارد نمائید
pip install Faker
توجه کنید که فیکر با حرف بزرگ باید نوشته شود (Faker). در صورت تمایل، میتوانید همین مثال را دنبال کنید. همچنین میتوانید از مجموعه دادهی دلخواه خود استفاده کنید. در اینجا و در ادامه کدی برای تولید 1000 رکورد آمده است:
import pandas as pd from faker import Faker import random # Initialize Faker to generate synthetic data fake = Faker() # Set seed for reproducibility Faker.seed(42) # Generate synthetic data data = [] for _ in range(1000): data.append({ 'Name': fake.name(), 'Age': random.randint(18, 70), 'Email': fake.email(), 'Phone': fake.phone_number(), 'Address': fake.address(), 'Salary': random.randint(20000, 150000), 'Join_Date': fake.date_this_decade(), 'Employment_Status': random.choice(['Full-Time', 'Part-Time', 'Contract']), 'Department': random.choice(['IT', 'Engineering','Finance', 'HR', 'Marketing']) })
حالا بیایید کمی روی این دیتافریم کار کنیم تا مقادیر گمشده، رکوردهای تکراری، دادههای پرت و موارد دیگر را به آن اضافه کنیم:
# Let's tweak the records a bit! # Introduce missing values for i in random.sample(range(len(data)), 50): data[i]['Email'] = None # Introduce duplicate records data.extend(random.sample(data, 100)) # Introduce outliers for i in random.sample(range(len(data)), 20): data[i]['Salary'] = random.randint(200000, 500000)
حال وقت این است که یک دیتافریم با این رکوردها بسازیم:
# Create dataframe df = pd.DataFrame(data)
توجه کنید که Seed روی Faker تنظیم شده، نه روی random. یعنی اطلاعاتی که درست میکنی کمی تصادفی خواهد شد.
مرحله 1: فهمیدن دادهها
قبل از اینکه کار خاصی روی دادهها انجام بدیم، باید یک دید کلی از اطلاعات داشته باشیم، ببینید هر ستون چی داره، چندتا رکورد هست و … اینجا از روش ()info برای نمایش اطلاعات کلی استفاده میکنیم.
df.info() Output >>> RangeIndex: 1100 entries, 0 to 1099 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Name 1100 non-null object 1 Age 1100 non-null int64 2 Email 1047 non-null object 3 Phone 1100 non-null object 4 Address 1100 non-null object 5 Salary 1100 non-null int64 6 Join_Date 1100 non-null object 7 Employment_Status 1100 non-null object 8 Department 1100 non-null object dtypes: int64(2), object(7) memory usage: 77.5+ KB
حالا با دستور زیر میتوانیم 5 ردیف اول دیتافریم را بدست آوریم:
df.head()
خروجی همانند تصویر زیر خواهد بود
مرحله 2: بررسی ردیفهای تکراری:
اکنون میخواهیم به حذف ردیفهای تکراری در دیتافریم بپردازیم این ردیفهای تکراری باعث ایجاد مشکل در تحلیل دادهها میشوند، چون نتایج را انحراف میدهند. به همین خاطر، لازمه که این ردیفها رو شناسایی و حذف کنیم تا فقط با دادههای منحصربهفرد و بدون تکرار کار کنیم. به این ترتیب، تحلیل دقیقتری خواهیم داشت.
# Check for duplicate rows duplicates = df.duplicated().sum() print("Number of duplicate rows:", duplicates) # Removing duplicate rows df.drop_duplicates(inplace=True) Output >>> Number of duplicate rows: 100
مرحله 3: مدیریت دادههای گمشده
دادههای گمشده (missing values) یکی از مشکلات رایج در کیفیت داده در بسیاری از پروژههای علم داده است .اگر نگاهی به خروجیِ متد info()
از مرحلهی قبل بیندازید، احتمالا متوجه خواهید شد که تعداد رکوردهای غیرخالی برای همهی فیلدها یکسان نیست و در ستون ایمیل مقادیر گمشده وجود دارد. با این حال، ما تعداد دقیق آنها را به دست خواهیم آورد .برای به دست آوردن تعداد دادههای گمشده در هر ستون، میتوانید کد زیر را اجرا کنید:
# Check for missing values missing_values = df.isna().sum() print("Missing Values:") print(missing_values) Output >>> Missing Values: Name 0 Age 0 Email 50 Phone 0 Address 0 Salary 0 Join_Date 0 Employment_Status 0 Department 0 dtype: int64
اگر در یک یا چند ستون عددی، دادههای گمشده وجود داشته باشد، میتوانیم از تکنیکهای جایگذاری مناسب (مانند میانگین یا میانه) برای پر کردن آنها استفاده کنیم. اما از آنجایی که فیلد «ایمیل» حاوی دادههای متنی است و امکان جایگذاری با تکنیکهای عددی وجود ندارد، بیایید به سادگی ایمیلهای گمشده را با یک ایمیل پیشفرض جایگزین کنیم.
# Handling missing values by filling with a placeholder df['Email'].fillna('unknown@example.com', inplace=True)
مرحله 4: تبدیل دادهها
وقتی با یک دیتاست کار میکنیم، ممکنه یک یا چند تا از فیلدها، نوع دادهی مورد انتظار رو در دیتافریم ما نداشته باشند. مثلن در اینجا، فیلد «تاریخ عضویت» (Join_Date) باید به یک تاریخ و زمان معتبر تبدیل بشه.
# Convert 'Join_Date' to datetime df['Join_Date'] = pd.to_datetime(df['Join_Date']) print("Join_Date after conversion:") print(df['Join_Date'].head()) Output >>> Join_Date after conversion: 0 2023-07-12 1 2020-12-31 2 2024-05-09 3 2021-01-19 4 2023-10-04 Name: Join_Date, dtype: datetime64[ns]
از اونجایی که تاریخ عضویت رو داریم، در واقع داشتن یک ستون به نام «سالهای کاری» (Years_Employed) به شکل زیر، مفیدتره:
# Creating a new feature 'Years_Employed' based on 'Join_Date' df['Years_Employed'] = pd.Timestamp.now().year - df['Join_Date'].dt.year print("New feature 'Years_Employed':") print(df[['Join_Date', 'Years_Employed']].head()) Output >>> New feature 'Years_Employed': Join_Date Years_Employed 0 2023-07-12 1 1 2020-12-31 4 2 2024-05-09 0 3 2021-01-19 3 4 2023-10-04 1
مرحله 5: پاکسازی دادههای متنی
در برخورد با فیلدهای رشتهای (متنی)، اغلب با قالببندیهای متناقض یا مشکلات مشابه مواجه میشویم. پاکسازی متن میتواند به سادگی تغییر حروف (بزرگ به کوچک یا برعکس) یا به سختی نوشتن یک عبارت باقاعدهی پیچیده برای رسیدن به فرمت مورد نیاز باشد.
در دیتافریمی که داریم، میبینیم که ستون «آدرس» حاوی کاراکترهای زیادی از نوع n\ (خط جدید) است که خوانایی را مختل میکند. بنابراین، بیایید آنها را با فاصله (Space) جایگزین کنیم، به این ترتیب:
# Clean address strings df['Address'] = df['Address'].str.replace('\n', ' ', regex=False) print("Address after text cleaning:") print(df['Address'].head()) Output >>> Address after text cleaning: 0 79402 Peterson Drives Apt. 511 Davisstad, PA 35172 1 55341 Amanda Gardens Apt. 764 Lake Mark, WI 07832 2 710 Eric Estate Carlsonfurt, MS 78605 3 809 Burns Creek Natashaport, IA 08093 4 8713 Caleb Brooks Apt. 930 Lake Crystalbury, CA... Name: Address, dtype: object
مرحله 6: تمیز کردن دادههای پرت
بعضی وقتها توی دادههامون اعداد خیلی غیرمعمولی وجود داره، مثل حقوقهای خیلی بالا که اشتباه وارد شدن. اینا رو باید پیدا کنیم و کاری کنیم که بقیه اطلاعات رو خراب نکنند. میتونیم ببینیم کدوم دادهها خیلی با بقیه فرق دارن و بعد یا پاکشون کنیم یا جداگونه بررسیشون کنیم.
حالا میخواهیم از یه روش به اسم «z-score» استفاده کنیم تا حقوقهای عجیب و غریب رو پیدا کنیم.
# Detecting outliers using z-score z_scores = (df['Salary'] - df['Salary'].mean()) / df['Salary'].std() outliers = df[abs(z_scores) > 3] print("Outliers based on Salary:") print(outliers[['Name', 'Salary']].head()) Output >>> Outliers based on Salary: Name Salary 16 Michael Powell 414854 131 Holly Jimenez 258727 240 Daniel Williams 371500 328 Walter Bishop 332554 352 Ashley Munoz 278539
مرحله 7: ادغام کردن دادهها
تو اکثر پروژهها، اطلاعاتی که دارین ممکنه همون اطلاعاتی نباشه که برای تحلیل لازمه. باید فیلدهای مرتبط رو پیدا کنین و همچنین دادهها رو از سایر جداول (دیتافریمها) ادغام کنین تا اطلاعات مفیدتری واسه تحلیل به دست بیاد.
یه تمرین کوچیک: یه دیتافریم مرتبط بسازین و اون رو با جدول فعلی بر اساس یه ستون مشترک ادغام کنین. ادغام کردن در پانداس خیلی شبیه به دستورهای الحاق (Join) در SQL هستش، پس این تمرین رو حتما امتحان کنین!
جمعبندی
خب اینم از این آموزش! ما یه نمونه جدول (دیتافریم) با رکوردهای مختلف درست کردیم و مراحل مختلف پاکسازی داده رو یاد گرفتیم. این مراحل شامل آشنایی با داده، مدیریت مقادیر تکراری، مدیریت دادههای گمشده، تبدیل دادهها، پاکسازی دادههای متنی، کار با دادههای عجیب و غریب و ادغام دادهها میشه.
منبع
Mastering Data Cleaning with Python and Pandas
اگر علاقمند ورود به دنیای مهندسی داده هستید، میتوانید با این دوره آغاز کنید