در دنیای علم داده، پیشپردازش دادهها یکی از مراحل حیاتی است. یکی از ابزارهای قدرتمند برای این کار در پانداس، متد DataFrame.where
است. این متد به شما امکان میدهد دادههای خود را بر اساس شرایط مشخص، به آسانی فیلتر کنید یا مقادیر خاصی را جایگزین کنید. در این پست، قصد داریم به طور کامل این متد را بررسی کرده و با مثالهای کاربردی، نحوه استفاده از آن را نشان دهیم.
متد where
چیست؟
متد where
در Pandas یک ابزار قدرتمند برای فیلتر کردن دادهها و جایگزینی مقادیر بر اساس شرایط مشخص است. این متد به شما اجازه میدهد مقادیری که یک شرط خاص را برآورده نمیکنند، با مقدار دیگری جایگزین کنید.
نحوه استفاده از متد where
ساختار کلی این متد به شکل زیر است:
DataFrame.where(cond, other=np.nan, *, inplace=False, axis=None, level=None)
این متد یک DataFrame جدید برمیگرداند که در آن مقادیر شرطی True
حفظ شده و بقیه با مقدار other
جایگزین شدهاند.
پارامترهای کلیدی
cond
: شرطی که باید بررسی شود. این شرط میتواند به صورت آرایه یا DataFrame باشد.other
: مقداری که به جای مقادیر شرطFalse
جایگزین میشود (پیشفرضNaN
).inplace
: اگرTrue
باشد، تغییرات به صورت inplace روی DataFrame اصلی اعمال میشوند.axis
: برای اعمال شرط روی سطرها یا ستونها.level
: برای کار با MultiIndexها.
پارامترها
cond(شرط اعمالی):هbool Series/DataFrame
, array-like
, یا callable
این پارامتر هسته اصلی عملکرد where
است.شرطی که تعیین میکند کدام مقادیر از DataFrame اصلی حفظ شوند.
- اگر
cond
مقدارTrue
داشته باشد، مقدار اصلی حفظ میشود - اگر
cond
مقدارFalse
داشته باشد، مقدار مربوطه باother
جایگزین میشود.
- اگر
cond
یک تابع (callable
) باشد: این تابع روی Series/DataFrame اعمال شده و باید یک Series/DataFrame دودیی (بولی) برگرداند. این تابع نباید مقادیر DataFrame اصلی را تغییر دهد (اما این موضوع توسط pandas بررسی نمیشود).
other(مقدار جایگزین): هscalar
, Series/DataFrame
, یا callable
- مقادیری که جایگزین مقادیر اصلی میشوند، اگر شرط
cond
=False
باشد
- اگر
other
یک تابع (callable
) باشد: این تابع روی Series/DataFrame اعمال شده و باید یک مقدارscalar
یا Series/DataFrame برگرداند. این تابع نیز نباید مقادیر DataFrame اصلی را تغییر دهد (pandas این موضوع را بررسی نمیکند). اگر مقدارother
مشخص نشود، به طور پیشفرض از مقدار NULL استفاده میشود:- الف) برای نوع دادههای NumPy، مقدار
NaN
- ب) برای نوع دادههای گسترشی (مثل
Int64
یاCategorical
)، مقدارpd.NA
- الف) برای نوع دادههای NumPy، مقدار
inplace: دودیی(bool
), پیشفرض: False
- اگر
True
باشد، عملیات به صورت inplace روی DataFrame اصلی انجام میشود و هیچ DataFrame جدیدی برگردانده نمیشود. - اگر
False
باشد، یک DataFrame جدید با تغییرات برگردانده میشود.
axis(انتخاب محور): عدد صحیح(int
), پیشفرض: None
مشخص میکند که تراز دادهها (alignment) روی کدام محور انجام شود. در DataFrameها:
axis=0
برای اعمال عملیات روی سطرهاaxis=1
برای اعمال عملیات روی ستونها
برای Series این پارامتر استفاده نمیشود و به طور پیشفرض ۰ است.
level: عدد صحیح (int
) , پیشفرض: None
در صورت استفاده از MultiIndex (ایندکس چندسطحی)، میتوان سطح خاصی از ایندکس را برای اعمال شرط مشخص کرد.
چیزی که این تابع برمیگرداند:
- همان نوع داده اصلی (DataFrame یا Series) برگردانده میشود، مگر اینکه
inplace=True
باشد. - اگر
inplace=True
باشد، متد مقدارNone
بازمیگرداند و تغییرات مستقیماً روی DataFrame/Series اعمال میشوند.
مثال:
مثال ۱: استفاده ساده از شرط
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
result = df.where(df > 2)
print(result)
خروجی:
A B
NaN NaN
NaN 5.0
۳.۰ ۶.۰
مثال ۲: استفاده از other
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
result = df.where(df > 2, other=0)
print(result)
خروجی:
A B
۰ ۰
۰ ۵
۳ ۶
مثال ۳: اعمال inplace
import pandas as pd
import numpy as np
df.where(df > 2, other=0, inplace=True)
print(df)
خروجی:
A B
۰ ۰
۰ ۵
۳ ۶
مثال ۴: استفاده از شرط و مقدار متغیر در other
import pandas as pd
import numpy as np
result = df.where(df > 2, other=df + 10)
print(result)
خروجی:
A B
۱۱ ۱۴
۱۲ ۵
۳ ۶
نکات مهم:
- کار با مقادیر گمشده: اگر
other
مشخص نشود، مقادیرFalse
بهNaN
تبدیل میشوند - MultiIndex: استفاده از
level
برای دادههایی با ایندکس چندسطحی میتواند کاربردی باشد - مقایسه با
mask
: متدmask
به صورت برعکس عمل میکند، یعنی شرطهایTrue
را با مقدارother
جایگزین میکند
تفاوت where
با mask
- متد
where
مقادیری را که شرط برقرار نیستند تغییر میدهد - متد
mask
برعکس عمل میکند: مقادیری را که شرط برقرار است تغییر میدهد
مثال:
df.mask(df > 2, other=0)