如何为Pandas DataFrame每行添加无效值计数与异常值判断列
实现步骤
首先修正你原代码里的小错误:DataFrame的列参数是columns(复数形式),不是column,修正后代码:
import numpy as np import pandas as pd dt = np.fromfile(path, dtype='float') df = pd.DataFrame(dt.reshape(-1, 3), columns=['X', 'Y', 'Z'])
1. 添加Is Invalid列
直接用isna()检测每行的NaN值,再按行求和就能得到每行的无效值数量:
df['Is Invalid'] = df.isna().sum(axis=1)
df.isna():生成和原DataFrame形状一致的布尔矩阵,NaN位置标记为True,其余为Falsesum(axis=1):按行对布尔值求和(True视为1,False视为0),得到每行的NaN总数
2. 添加Is Outlier列
常用**四分位距法(IQR)**判断异常值,具体实现如下:
# 计算每列的四分位数Q1、Q3和IQR(四分位距) Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 # 标记每个元素是否为异常值(小于Q1-1.5*IQR 或 大于Q3+1.5*IQR) outlier_mask = (df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR)) # 按行判断是否存在异常值,生成布尔列 df['Is Outlier'] = outlier_mask.any(axis=1)
outlier_mask:布尔矩阵,每个位置标记对应元素是否为异常值any(axis=1):按行判断,只要该行有一个异常值就返回True,否则返回False
完整示例代码
import numpy as np import pandas as pd # 读取数据并构建DataFrame dt = np.fromfile(path, dtype='float') df = pd.DataFrame(dt.reshape(-1, 3), columns=['X', 'Y', 'Z']) # 添加Is Invalid列 df['Is Invalid'] = df.isna().sum(axis=1) # 添加Is Outlier列 Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 outlier_mask = (df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR)) df['Is Outlier'] = outlier_mask.any(axis=1) # 查看结果 print(df.head())
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

