如何移除DataFrame指定列的异常值?解决列长度不匹配报错
问题原因与解决方案
错误根源
- 调用方式错误:你把返回整个DataFrame的函数结果,直接赋值给了
df['no_of_trainings']单列,类型和长度完全不匹配,这是触发Columns must be same length as key报错的直接原因。 - 函数内部逻辑问题:你试图直接把过滤后的短列赋值回原DataFrame的列,过滤后数据行数减少,必然导致列长度和原DataFrame行数不一致,同样会引发长度不匹配的错误。
修正方案
根据需求,有两种常见处理方式:
方式1:移除包含目标列异常值的整行
如果需要直接删除异常值所在的行,函数可以这样写:
def remove_outlier_rows(df, column): q1 = df[column].quantile(0.25) q3 = df[column].quantile(0.75) IQR = q3 - q1 lower_bound = q1 - 1.5 * IQR upper_bound = q3 + 1.5 * IQR # 用布尔索引筛选出非异常值的行 return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
调用方式:
# 直接替换原df,或者赋值给新变量 df = remove_outlier_rows(df, 'no_of_trainings')
方式2:将异常值替换为NaN(保留行)
如果不想删除行,只是把异常值标记为缺失值,函数可以改成:
def replace_outlier_with_nan(df, column): q1 = df[column].quantile(0.25) q3 = df[column].quantile(0.75) IQR = q3 - q1 lower_bound = q1 - 1.5 * IQR upper_bound = q3 + 1.5 * IQR # 用mask把异常值替换为NaN df[column] = df[column].mask((df[column] < lower_bound) | (df[column] > upper_bound)) return df
调用方式:
# 替换原df的列,或者赋值给新df df = replace_outlier_with_nan(df, 'no_of_trainings') # 或者直接修改原df(函数内部已经修改,也可以不用赋值) replace_outlier_with_nan(df, 'no_of_trainings')
原代码失效原因
原代码中df[column] = df[column][df[column] > lower_bound]这种写法,会生成一个长度更短的Series(只保留符合条件的值),但原DataFrame的行数不变,把短Series赋值给原列时,Pandas无法对齐所有行,就会抛出长度不匹配的错误。而用布尔索引筛选整行,或者用mask替换值,都能保证列的长度和原DataFrame一致。
内容的提问来源于stack exchange,提问作者Wee Liang Kelven Lim
相关产品推荐
相关产品推荐

