如何按城市分组调用自定义函数删除DataFrame中销售数据的离群值
实现方案
最优实现基于Pandas的groupby+向量化操作完成,不需要循环遍历城市,性能远高于逐组循环的实现,同时可以避免原有isin逻辑的误判问题。
步骤1:调整离群值检测逻辑(可选但更高效)
直接返回单组内每个值是否为离群值的布尔掩码,避免返回列表再匹配的开销:
import numpy as np import pandas as pd def is_discrete_outlier(data, threshold=3): mean = np.mean(data) std = np.std(data) z_score = (data - mean) / std return np.abs(z_score) > threshold
步骤2:按城市分组计算离群值并过滤
# 按城市分组,对每个城市的销售额单独计算离群值掩码 outlier_mask = df.groupby('City')['Sales'].transform(is_discrete_outlier) # 剔除离群值,保留正常数据 df = df[~outlier_mask]
注意:请将代码中的列名替换为你实际DataFrame的列名,保持大小写一致。
如果你不想修改原有检测函数
也可以用groupby.apply适配原有逻辑,不过性能略低于上面的方案:
df = df.groupby('City').apply( lambda group: group[~group['Sales'].isin(detect_discrete_outliers(group['Sales']))] ).reset_index(drop=True)
方案优势
- 完全基于Pandas向量化操作,数据量越大性能优势越明显
- 自动适配所有城市,新增城市无需修改代码
- 避免了不同城市出现相同销售额时,
isin逻辑误删其他城市正常数据的问题
内容的提问来源于stack exchange,提问作者Pratibha UR
相关产品推荐
相关产品推荐

