首页 > 解决方案 > Pandas 将函数应用于列表中的多个列

问题描述

我正在尝试创建一个函数,该函数创建一个修改后的数据框,其中所有异常值都从我的变量 num_vars 中存储的列中删除。到目前为止,这是我的功能:

def remove_outliers(column):
    Q1 = np.percentile(df[column], 25, interpolation = 'midpoint')
    Q3 = np.percentile(df[column], 75, interpolation = 'midpoint')        
    IQR = Q3 - Q1
    IQR_mult = IQR * 1.5
    ceiling = Q3 + IQR_mult
    floor = Q1 - IQR_mult
    return df[(df[column] <= ceiling) & (df[column] >= floor)]

我要应用此功能的列存储在

 num_vars = ['host_response_rate', 'accommodates', 'bedrooms', 'beds', 'minimum_nights', 'availability_30', 'number_of_reviews', 'review_scores_rating', 'review_scores_cleanliness', 'review_scores_checkin', 'review_scores_communication', 'review_scores_location', 'review_scores_value', 'time_from_last_review', 'num_amenities', 'price']

该函数仅在调用诸如“价格”之类的一列时起作用,但在一次调用多个项目时不返回干净的数据框。我怎样才能做到这一点,以便该函数可以一次获取所有这些列,并返回一个已删除所有异常值的数据框?

标签: pythonpandasfunctionnumpylambda

解决方案


您可以更改您的 remove_outlier 函数以接受行和列参数,然后使用应用于行的函数遍历列,如下所示:

def remove_outliers(row,column):
    Q1 = np.percentile(df[column], 25, interpolation = 'midpoint')
    Q3 = np.percentile(df[column], 75, interpolation = 'midpoint')
    IQR = Q3 - Q1
    IQR_mult = IQR * 1.5
    ceiling = Q3 + IQR_mult
    floor = Q1 - IQR_mult
    if float(ceiling)>= row[column] >= int(floor):
        return row[column]
    else:
        return None


num_vars = ['host_response_rate', 'accommodates', 'bedrooms', 'beds', 'minimum_nights', 'availability_30',
            'number_of_reviews', 'review_scores_rating', 'review_scores_cleanliness', 'review_scores_checkin',
            'review_scores_communication', 'review_scores_location', 'review_scores_value', 'time_from_last_review',
            'num_amenities', 'price']
for col in num_vars[:3]:
    df[col] = df.apply(lambda row: remove_outliers(row,col), axis=1)
df = df.dropna().reset_index(drop=True)

推荐阅读