وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

دستکاری کارآمد داده با تابع Apply() در پانداها

0 37
زمان لازم برای مطالعه: 5 دقیقه


معرفی

را apply() function یک ابزار قدرتمند در پایتون برای تجزیه و تحلیل و دستکاری داده ها است. این ابزار ارزشمندی برای جعبه ابزار هر تحلیلگری است، زیرا می تواند به طور یکپارچه با سایر توابع پانداها و توابع سفارشی برای انجام تبدیل داده های پیچیده ادغام شود.

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

نمای کلی تابع Apply()

را apply() تابع به شما امکان می دهد طیف وسیعی از تبدیل ها را پیاده سازی کنید روی داده های شما شما می توانید تابع خود را برای کارهای خاص، مانند دستکاری رشته، عملیات پیچیده، یا محاسبات سفارشی تعریف کنید. پس از تعریف، می توانید apply() اینها را در DataFrame خود بدون نیاز به کدنویسی مجدد هر بار که نیاز به استفاده از آنها دارید. به طور مشابه، شما می توانید a را تعریف کنید تابع لامبدا، که یک عملیات ناشناس و سریع ایجاد شده است روی پرواز. می توانید آن را منتقل کنید apply() برای استفاده فوری از آن روی داده های شما را apply() تابع همچنین می تواند با توابع داخلی که با پایتون از قبل بسته بندی شده اند استفاده شود. سری Pandas و DataFrames هر دو با استفاده از سازگار هستند apply().

استفاده از Apply() روی یک سری

بیایید با وارد کردن پکیج پانداها و استفاده از Series() کلاس:

import pandas as pd

city_temps = pd.Series((1, 4, 8, 9, 14, 25, 31, 35, 32, 25, 11, 2))

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

def celsius_to_fahrenheit(celsius):
    fahrenheit = (celsius * 9/5) + 32
    return fahrenheit

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

temp_fahrenheit = city_temps.apply(celsius_to_fahrenheit)
print(temp_fahrenheit)

خروجی یک سری است که حاوی مقادیر تبدیل شده دمای شهر است:

0     33.8
1     39.2
2     46.4
3     48.2
4     57.2
5     77.0
6     87.8
7     95.0
8     89.6
9     77.0
10    51.8
11    35.6
dtype: float64

اعمال کردن apply() به یک DataFrame

استفاده کردن apply() انعطاف پذیری را برای افزودن یا دستکاری ستون ها در Pandas DataFrames فراهم می کند. یک DataFrame با میانگین دمای ماهانه در طول یک سال برای دو شهر در نظر بگیرید:

data = {'City 1': (1, 4, 8, 9, 14, 25, 31, 35, 32, 25, 11, 2),
        'City 2': (19, 23, 30, 31, 35, 40, 45, 39, 30, 25, 15, 10)
       }

df = pd.DataFrame(data)
print(df)

DataFrame به صورت زیر ظاهر می شود:

    City 1  City 2
0        1      19
1        4      23
2        8      30
3        9      31
4       14      35
5       25      40
6       31      45
7       35      39
8       32      30
9       25      25
10      11      15
11       2      10

ما میتوانیم apply() عملکرد ما روی را df DataFrame و یک ستون جدید ایجاد کنید City 1 Fahrenheit:

df('City 1 Fahrenheit') = df('City 1').apply(celsius_to_fahrenheit)


print(df)

تحول موفقیت آمیز بود:

    City 1  City 2  City 1 Fahrenheit
0        1      19               33.8
1        4      23               39.2
2        8      30               46.4
3        9      31               48.2
4       14      35               57.2
5       25      40               77.0
6       31      45               87.8
7       35      39               95.0
8       32      30               89.6
9       25      25               77.0
10      11      15               51.8
11       2      10               35.6

نکته مهم در اینجا استفاده از axis پارامتر در apply() تابع، که نشان می دهد که آیا می خواهیم عملیات را انجام دهیم یا خیر روی سطرها یا ستون های DataFrame. مشخص کردن axis=0 در حالی که عملیات را برای هر ستون اعمال می کند axis=1 آن را برای هر ردیف اعمال می کند. در مثال قبلی ما، پیش فرض axis=0 از آنجایی استفاده شد که ما به صراحت مقداری را برای آن ارسال نکردیم axis. این تابع ما را به هر ستون اعمال کرد و برای هر سطر یک مقدار برگرداند.

به صراحت بگذریم axis=1 به apply() تابع سفارشی ما برای تمام ستون های DataFrame. با اعمال تبدیل به هر سطر، دو ستون جدید ایجاد خواهیم کرد.

data = {'City 1': (1, 4, 8, 9, 14, 25, 31, 35, 32, 25, 11, 2),
        'City 2': (19, 23, 30, 31, 35, 40, 45, 39, 30, 25, 15, 10)
       }

df = pd.DataFrame(data)

df(('City 1 Fahrenheit', 'City 2 Fahrenheit')) = df.apply(
    lambda row: pd.Series(
        (celsius_to_fahrenheit(row('City 1')),
         celsius_to_fahrenheit(row('City 2')))),
         axis=1
)

print(df)

ما در اینجا از عبارت lambda استفاده کردیم تا هر ردیف را به عنوان ورودی با استفاده از آن در نظر بگیریم axis=1 و یک شیء سری با مقادیر فارنهایت را برگرداند. این سری به‌دست‌آمده به ستون‌های «City 1 Fahrenheit» و «City 2 Fahrenheit» در DataFrame اختصاص داده شد.

نوع بازگشت تابع Apply() را تعیین کنید

شاید قبلاً متوجه این موضوع شده باشید apply() همیشه یک سری در نمونه های قبلی ما برمی گرداند. به طور کلی، نتیجه تابع اعمال شده یک شی سری است که ساختار نمایه سازی داده های اصلی را حفظ می کند. با این حال، ما می توانیم از آن استفاده کنیم result_type پارامتر و مقدار آن را روی “expand” تنظیم کنید، که به آن دستور می دهد یک DataFrame را برگرداند. این به ویژه زمانی مفید است که ما نیاز به تغییر شکل ساختار داده یا اعمال توابعی که چندین مقدار را ایجاد می کنند، مفید است.

بیایید مثال قبلی خود را اصلاح کنیم تا ببینیم چگونه می توانیم یک DataFrame را با استفاده از آن برگردانیم result_type پارامتر.

data = {'City 1': (1, 4, 8, 9, 14, 25, 31, 35, 32, 25, 11, 2),
        'City 2': (19, 23, 30, 31, 35, 40, 45, 39, 30, 25, 15, 10)
       }

df = pd.DataFrame(data)

df(('City 1 (Fahrenheit)', 'City 2 (Fahrenheit)')) = df.apply(lambda row: celsius_to_fahrenheit(row), axis=1, result_type='expand')

print(df)

خروجی همان است که قبلاً به دست آوردیم:

    City 1  City 2  City 1 (Fahrenheit)  City 2 (Fahrenheit)
0        1      19                 33.8                 66.2
1        4      23                 39.2                 73.4
2        8      30                 46.4                 86.0
3        9      31                 48.2                 87.8
4       14      35                 57.2                 95.0
5       25      40                 77.0                104.0
6       31      45                 87.8                113.0
7       35      39                 95.0                102.2
8       32      30                 89.6                 86.0
9       25      25                 77.0                 77.0
10      11      15                 51.8                 59.0
11       2      10                 35.6                 50.0

واضح است که result_type ما را قادر می سازد تا تبدیل ستون های جدید را تا حد زیادی ساده کنیم، زیرا دیگر نیازی به دستکاری صریح خروجی برای تبدیل آن به ساختار DataFrame نداریم.

ملاحظات عملکرد

اگر چه apply() به نظر می‌رسد تابع ابزار قدرتمندی برای ساده‌سازی تبدیل داده‌ها باشد، برای انواع خاصی از وظایف مناسب‌تر است. علاوه بر تبدیل داده‌های سفارشی یا عملیات‌های ردیف و ستون، همانطور که قبلاً ذکر شد، می‌توان از آن برای ترکیب ستون‌ها برای تمیز کردن داده‌ها یا مهندسی ویژگی استفاده کرد. علاوه بر این، برای مدیریت مقادیر گمشده مفید است، زیرا می‌توانیم روش‌های انتساب سفارشی را تعریف و اعمال کنیم.

ارزش در نظر گرفتن رویکردهای جایگزین را دارد apply() اگر به عملکرد بهینه برای مجموعه داده های بزرگ یا کارهایی که از نظر محاسباتی فشرده هستند نیاز دارید. شما باید تا حد امکان از عملیات بردار داخلی استفاده کنید. به عنوان مثال، شما می توانید استفاده کنید sum() روش به جای apply(sum). همچنین می‌توانید از عملیات‌های رشته‌ای داخلی مانند str.replace() و عملیات مشروط مانند where() برای تجمیع کارآمد و عملیات گروهی. علاوه بر این، بسته های پایتون مانند Swifter یا Dask را در نظر بگیرید که از پردازش موازی برای کار موثر با مجموعه داده های بزرگتر استفاده می کنند. بسته به روی اندازه مجموعه داده شما و منابع محاسباتی موجود، این گزینه‌ها می‌توانند به طور قابل توجهی عملکرد کارهای دستکاری داده را در مقایسه با استفاده از apply() تنها.

افکار نهایی

به طور خلاصه، apply() تابع به عنوان یک منبع ارزشمند برای دستکاری داده ها عمل می کند، به خصوص در کارهای معمولی که نیاز به کدهای تکراری دارند. این عملکرد امکان یکپارچه سازی یکپارچه توابع سفارشی یا داخلی را با سری Pandas و DataFrames فراهم می کند. شناسایی فرصت ها برای استفاده از apply() عملکرد می تواند به طور قابل توجهی بهره وری شما را در کارهای روزانه بهبود بخشد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1402-12-30 21:38:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید