如何使用any()函数识别DataFrame中Annual Income列的异常值
问题分析与解决方法
为什么之前的代码返回空Series?
你用np.random.randint(0, 100)生成的Annual Income列取值范围是0到99的整数。对于这个均匀分布的数据,均值大概在49.5左右,标准差约28.87,3倍标准差就是86.6。算出来的上下限分别是136.1和-37.1,你的数据根本碰不到这个范围,所以自然返回空的Series。
用any()识别异常值的步骤
any()的作用是判断布尔序列里有没有至少一个True,刚好能用来快速判断某列有没有异常值。具体操作如下:
1. 生成异常值标记掩码
先做一个布尔Series,把每行的Annual Income是否超出3σ范围标记出来:
# 先算上下限 upper_limit = RandomValues['Annual Income'].mean() + 3 * RandomValues['Annual Income'].std() lower_limit = RandomValues['Annual Income'].mean() - 3 * RandomValues['Annual Income'].std() # 标记异常值:超出上限或低于下限的行设为True outlier_mask = (RandomValues['Annual Income'] > upper_limit) | (RandomValues['Annual Income'] < lower_limit)
2. 用any()判断是否存在异常值
直接对掩码调用any(),返回True就说明有异常值,False就是没有:
has_outliers = outlier_mask.any() print(f"是否存在异常值: {has_outliers}")
3. (可选)提取异常值行
如果确实存在异常值,用掩码就能把对应的行筛出来:
if has_outliers: outlier_rows = RandomValues[outlier_mask] print("异常值数据行:") print(outlier_rows) else: print("当前数据里没有符合3σ标准的异常值")
测试验证:手动加异常值
为了看到实际效果,你可以手动给Annual Income加几个超出0-99的值测试:
# 手动插入两个异常值 RandomValues.loc[500] = [10, 20, 30, 40, 150] # 远高于上限 RandomValues.loc[501] = [50, 60, 70, 80, -20] # 远低于下限 # 重新计算并检测 upper_limit = RandomValues['Annual Income'].mean() + 3 * RandomValues['Annual Income'].std() lower_limit = RandomValues['Annual Income'].mean() - 3 * RandomValues['Annual Income'].std() outlier_mask = (RandomValues['Annual Income'] > upper_limit) | (RandomValues['Annual Income'] < lower_limit) print(outlier_mask.any()) # 输出True print(RandomValues[outlier_mask]) # 会输出包含150和-20的两行数据
内容的提问来源于stack exchange,提问作者Gurbanoğlu
相关产品推荐
相关产品推荐

