[英]Apply a function to several columns in a data frame
我有以下 function:
def remove_outlier(dfIn, colName):
q1 = dfIn[colName].quantile(0.10)
q3 = dfIn[colName].quantile(0.90)
iqr = q3-q1
fenceLow = q1 - 1.5 * iqr
fenceHigh = q3 + 1.5 * iqr
dfOut = dfIn.loc[(dfIn[colName] > fenceLow) & (dfIn[colName] < fenceHigh)]
return dfOut
我想將 function 獨立(一一)應用於數據幀中的多個列,而無需多次調用 function。
最有效的方法是什么? 還是可以更改 function 以傳遞列名列表?
這可以在 2 次申請中完成。 在此解決方案中,將分別檢測每列的異常值,並單獨刪除包含任何列的異常值的行。
假設這個數據集。 我修改了您的 function 並將 q1 和 q3 值固定為應有的值。
A B C D
0 1 100 2 3
1 1 200 4 5
2 1 12000 4 7
3 2 100 22 2
4 2 200 3 1
#Modified function
def get_outliers(l):
#if you keep 0.1 and 0.75 then pretty much no outliers will be filtered
#q1 is 0.25 quantile and q3 is 0.75 quantile
q1 = l.quantile(0.25)
q3 = l.quantile(0.75)
iqr = q3-q1
fenceLow = q1 - 1.5 * iqr
fenceHigh = q3 + 1.5 * iqr
return [~(i>=fenceLow and i<=fenceHigh) for i in l]
第一步是獲取應用 function 以獲取列限制並獲取每列的 boolean 值列表。
outliers = df.apply(get_outliers)
A B C D
0 False False False False
1 False False False False
2 False True False False
3 False False True False
4 False False False False
第二步是找到其中任何一個值為 True 的行並將它們刪除。
df[~outliers.apply(lambda x:any(x), axis=1)]
A B C D
0 1 100 2 3
1 1 200 4 5
4 2 200 3 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.