قسمت پانزدهم – تعریف تابع در پانداس

تعریف تابع با استفاده از def در پانداس مزایای متعددی دارد که در پروژه‌های پردازش داده‌ها به خصوص برای کارهای تکراری و پیچیده، کار را بسیار ساده‌تر و مؤثرتر می‌کند. در زیر برخی از مهم‌ترین مزایای این روش آورده شده است:

  1. کاهش تکرار کد

با استفاده از   def می‌توانید توابعی برای عملیات‌های تکراری تعریف کنید. به این ترتیب، نیازی به نوشتن کدهای تکراری ندارید و اگر تغییرات یا اصلاحاتی لازم باشد، تنها کافی است آن را در تابع انجام دهید.

  1. خوانایی و سازماندهی بهتر کد

تعریف توابع با نام‌های معنی‌دار و واضح، باعث می‌شود که کد شما خواناتر و سازماندهی‌شده‌تر باشد. این موضوع به خصوص در پروژه‌های بزرگتر و پیچیده‌تر اهمیت دارد و باعث می‌شود کد راحت‌تر قابل درک و نگهداری باشد.

  1. تسهیل در اشکال‌زدایی و تست کد

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

  1. ایجاد قابلیت بازاستفاده (Reusability )

با استفاده از توابع، می‌توانید یک بار کد را بنویسید و در هر جای پروژه خود دوباره از آن استفاده کنید. این کار به خصوص زمانی که عملیات مشابهی بر روی ستون‌های مختلف یا DataFrameهای مختلف انجام می‌شود، کاربرد دارد.

  1. افزایش انعطاف‌پذیری

با تعریف توابع مختلف می‌توانید کد خود را به شکلی بنویسید که با تغییر ورودی، به نتایج مختلفی برسد. برای مثال، اگر یک تابع پردازش ستون برای مقادیر مختلف تنظیم کنید، می‌توانید همان تابع را با تنظیم پارامترهای مختلف در پروژه‌های مختلف به کار بگیرید.

  1. کاهش احتمال خطا

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

  1. قابلیت ترکیب توابع برای انجام عملیات پیچیده‌تر

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

  1. سرعت‌بخشی به انجام عملیات‌های پردازشی

در بسیاری از مواقع، استفاده از apply و توابع تعریف‌شده با  def سرعت پردازش داده‌ها را افزایش می‌دهد، زیرا این روش‌ها بهینه‌تر از حلقه‌های معمولی (for loop) در پانداس عمل می‌کنند.

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

حالا با هم چندین مثال مختلف با تعریف تابع را با هم بررسی کنیم :

  1. تابعی برای استانداردسازی مقادیر یک ستون

این تابع برای استانداردسازی مقادیر عددی یک ستون استفاده می‌شود (مثلاً مقادیر را به نحوی تغییر دهیم که میانگین آن‌ها صفر و انحراف معیار آن‌ها یک شود).

import pandas as pd

# داده نمونه
data = {'score': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)

# تابع استانداردسازی
def standardize(column):
    return (column - column.mean()) / column.std()

# اعمال تابع
df['standardized_score'] = standardize(df['score'])
print(df)
   score  standardized_score
۰     ۱۰           -۱.۲۶۴۹۱۱
۱     ۲۰           -۰.۶۳۲۴۵۶
۲     ۳۰            ۰.۰۰۰۰۰۰
۳     ۴۰            ۰.۶۳۲۴۵۶
۴     ۵۰            ۱.۲۶۴۹۱۱
  1. تابعی برای شناسایی و دسته‌بندی داده‌های متنی

این تابع متون را به گروه‌های مختلف دسته‌بندی می‌کند؛ مثلاً شناسایی مقادیر “مهم” و “عادی” در یک ستون متنی.

import pandas as pd
# داده نمونه
data = {'text': ['urgent', 'normal', 'urgent', 'low', 'normal']}
df = pd.DataFrame(data)

# تابع دسته‌بندی متن
def categorize_text(text):
    if text == 'urgent':
        return 'high'
    elif text == 'normal':
        return 'medium'
    else:
        return 'low'

# اعمال تابع
df['priority'] = df['text'].apply(categorize_text)
print(df)
     text priority
۰  urgent     high
۱  normal   medium
۲  urgent     high
۳     low      low
۴  normal   medium
  1. تابعی برای استخراج سال از تاریخ

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

import pandas as pd
# داده نمونه
data = {'date': ['2022-01-01', '2023-07-15', '2021-03-22']}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])

# تابع استخراج سال
def extract_year(date):
    return date.year

# اعمال تابع
df['year'] = df['date'].apply(extract_year)
print(df)
        date  year
۰ ۲۰۲۲-۰۱-۰۱  ۲۰۲۲
۱ ۲۰۲۳-۰۷-۱۵  ۲۰۲۳
۲ ۲۰۲۱-۰۳-۲۲  ۲۰۲۱
  1. تابعی برای محاسبه تخفیف بر اساس قیمت

این تابع بر اساس یک شرط، تخفیفی را بر قیمت‌های محصولات اعمال می‌کند.

import pandas as pd
# داده نمونه
data = {'price': [100, 200, 300, 400]}
df = pd.DataFrame(data)

# تابع محاسبه تخفیف
def apply_discount(price):
    if price > 250:
        return price * 0.9  # 10% تخفیف
    else:
        return price

# اعمال تابع
df['discounted_price'] = df['price'].apply(apply_discount)
print(df)

   price  discounted_price
۰    ۱۰۰             ۱۰۰.۰
۱    ۲۰۰             ۲۰۰.۰
۲    ۳۰۰             ۲۷۰.۰
۳    ۴۰۰             ۳۶۰.۰
  1. تابعی برای ترکیب چندین ستون به یک فرمت خاص

این تابع نام و نام خانوادگی را از ستون‌های مجزا گرفته و به یک ستون کامل تبدیل می‌کند.

import pandas as pd
# داده نمونه
data = {'first_name': ['Ali', 'Sara', 'John'], 'last_name': ['Rezaei', 'Ahmadi', 'Doe']}
df = pd.DataFrame(data)

# تابع ترکیب نام و نام خانوادگی
def full_name(row):
    return f"{row['first_name']} {row['last_name']}"

# اعمال تابع
df['full_name'] = df.apply(full_name, axis=1)
print(df)

  first_name last_name    full_name
۰        Ali    Rezaei   Ali Rezaei
۱       Sara    Ahmadi  Sara Ahmadi
۲       John       Doe     John Doe
  1. تابعی برای ایجاد ستون طبقه‌بندی سن

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

import pandas as pd
# داده نمونه
data = {'age': [12, 25, 40, 65, 80]}
df = pd.DataFrame(data)

# تابع طبقه‌بندی سن
def age_category(age):
    if age < 18:
        return 'Child'
    elif age < 40:
        return 'Adult'
    elif age < 60:
        return 'Middle-aged'
    else:
        return 'Senior'

# اعمال تابع
df['age_group'] = df['age'].apply(age_category)
print(df)
   age    age_group
۰   ۱۲        Child
۱   ۲۵        Adult
۲   ۴۰  Middle-aged
۳   ۶۵       Senior
۴   ۸۰       Senior
  1. تابعی برای بررسی داده‌های گم‌شده و جایگزینی آنها

این تابع برای جایگزینی مقادیر NaN در یک ستون با مقدار متوسط ستون استفاده می‌شود.

import pandas as pd
# داده نمونه
data = {'value': [1, 2, None, 4, None]}
df = pd.DataFrame(data)

# تابع جایگزینی مقادیر گم‌شده
def fill_na_with_mean(column):
    mean_value = column.mean()
    return column.fillna(mean_value)

# اعمال تابع
df['value'] = fill_na_with_mean(df['value'])
print(df)

      value
۰  ۱.۰۰۰۰۰۰
۱  ۲.۰۰۰۰۰۰
۲  ۲.۳۳۳۳۳۳
۳  ۴.۰۰۰۰۰۰
۴  ۲.۳۳۳۳۳۳

در پانداس می‌توان توابعی تعریف کرد که بیش از یک ورودی دریافت کنند و سپس این توابع را با استفاده از apply و lambda روی DataFrame یا ستون‌های خاصی اعمال کرد. برای این کار کافی است تابعی با چندین پارامتر تعریف کنیم و در زمان فراخوانی تابع، پارامترهای اضافی را به کمک apply به تابع منتقل کنیم.

  1. در این مثال تابعی تعریف می‌کنیم که مجموع دو ستون را محاسبه می‌کند و سپس یک مقدار ثابت که به عنوان پارامتر به تابع داده می‌شود را از آن کم می‌کند
import pandas as pd

# داده نمونه
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)

# تعریف تابع با چندین ورودی
def add_and_subtract(x, y, constant):
    return x + y - constant

# اعمال تابع با پارامتر ثابت اضافی
df['result'] = df.apply(lambda row: add_and_subtract(row['A'], row['B'], constant=2), axis=1)
print(df)

   A  B  result
۰  ۱  ۴       ۳
۱  ۲  ۵       ۵
۲  ۳  ۶       ۷

تابع add_and_subtract سه ورودی دارد: x و y که به ترتیب مقادیر دو ستون را دریافت می‌کنند، و constant که به عنوان یک پارامتر اضافی به تابع داده می‌شود.

در اینجا از apply و lambda استفاده شده تا به هر ردیف df دسترسی داشته باشیم و پارامتر constant را به صورت ثابت برابر با ۲ در نظر گرفته‌ایم.

 

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *