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