如何在Pandas DataFrame中计算异常值、生成标记列(含NaN处理与统计)
解决方案
步骤1:修正数据读取代码
你当前的DataFrame创建代码里column参数拼写错误,应改为columns:
import numpy as np import pandas as pd from scipy import stats dt = np.fromfile(path, dtype='float') df = pd.DataFrame(dt.reshape(-1, 3), columns=['X', 'Y', 'Z'])
步骤2:新增「Is Outlier」列
按需求分逻辑处理:
- 标记含NaN的行:用
df.isna().any(axis=1)判断每行是否存在缺失值,对应位置设为NaN - 对无缺失值的行,计算各列Z-score的绝对值,判断是否存在≥3的情况,存在则标记
True,否则False
完整实现代码:
# 判断每行是否包含至少一个NaN值 has_nan = df.isna().any(axis=1) # 计算Z-score(自动忽略NaN),判断每行是否存在至少一个异常值(Z-score绝对值≥3) is_outlier_row = (np.abs(stats.zscore(df, nan_policy='omit')) >= 3).any(axis=1) # 按条件赋值:有NaN的行设为NaN,其余用异常值判断结果 df['Is Outlier'] = np.where(has_nan, np.nan, is_outlier_row)
步骤3:统计「Is Outlier」列中True的数量
直接用sum()统计即可,NaN会被自动忽略:
true_count = df['Is Outlier'].sum() print(f"异常值行数量:{true_count}")
补充说明
stats.zscore的nan_policy='omit'参数会忽略NaN值计算Z-score,确保无缺失值的行能正常完成异常值判断np.where可以精准实现“有NaN设为NaN,否则按异常值规则标记”的逻辑
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

