Python 将函数应用于数据帧中的多个列
我有以下功能:Python 将函数应用于数据帧中的多个列,python,dataframe,apply,Python,Dataframe,Apply,我有以下功能: def删除异常值(dfIn,colName): q1=dfIn[colName]。分位数(0.10) q3=dfIn[colName]。分位数(0.90) iqr=q3-q1 fenceLow=q1-1.5*iqr fenceHigh=q3+1.5*iqr dfOut=dfIn.loc[(dfIn[colName]>fenceLow)和(dfIn[colName]
def删除异常值(dfIn,colName):
q1=dfIn[colName]。分位数(0.10)
q3=dfIn[colName]。分位数(0.90)
iqr=q3-q1
fenceLow=q1-1.5*iqr
fenceHigh=q3+1.5*iqr
dfOut=dfIn.loc[(dfIn[colName]>fenceLow)和(dfIn[colName]
我希望将该函数独立地(一个接一个地)应用于数据帧中的多个列,而无需多次调用该函数
最有效的方法是什么?或者可以将函数更改为传递列名列表吗?这可以在两个应用程序中完成在此解决方案中,分别检测每列的异常值,并分别删除包含任何列的异常值的行。 假设这个数据集。我修改了您的函数,并将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
第二步是找到其中任何一个值为True的行并删除它们
df[~outliers.apply(lambda x:any(x), axis=1)]
“不多次调用函数”是什么意思?每列有分位数,因此必须多次调用它。是否希望为所有列使用一个函数以提高可读性?你想提高绩效吗?你的目标是什么?如果可能的话,最好是两者都有,但主要是可读性。非常感谢,为了传递列名列表,我尝试对其进行更改,但不幸的是无法使其工作。对于实际iqr,您的q1和q3需要分别为0.25和0.75。否则,几乎不会删除任何异常值。此外,这将需要2个应用函数。。一个在轴0上,一个在轴1上。检查下面我的答案。我修改了你的函数,并在函数定义后添加了两行代码,以满足你的需要。非常感谢。但是,所有列都应单独处理,因为其中包含的数据范围差异很大。对不起,我应该提到这一点。在我的代码中,所有列的处理方式都不同。iqr为每列计算,并分别为每列返回布尔值。Post将删除包含异常值的行更具体地说,将分别检测每列的异常值,然后分别删除每行的异常值。此解决方案处理不同列的不同数据范围。啊,是的,对不起,现在理解:)非常感谢!编辑数据集以包含不同的数据范围,以使解决方案更清晰
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
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