Pandas基于IQR分数过滤DataFrame行时报axis 1相关ValueError如何解决
错误成因
- 你通过
df_boyd['MTTR']/df_boyd.MTTR取到的是一维Series对象,只有行索引一个维度,没有列维度的概念,axis=1是专门给DataFrame用的参数,代表按行维度做聚合,Series对象根本不支持该参数。 - 你的业务逻辑是判断单
MTTR列的每行数值是否属于异常区间,计算后得到的本身就是长度和行数一致的布尔Series,完全不需要调用any()聚合方法,多余的any(axis=1)是报错的直接来源。
修复方案
直接删除多余的.any(axis=1)即可,正确代码如下:
df_boyd_out = df_boyd[~((df_boyd['MTTR'] < (Q1 - 1.5 * IQR)) | (df_boyd['MTTR'] > (Q3 + 1.5 * IQR)))]
如果后续需要对多列做异常值过滤,比如同时判断MTTR、MTBF两列的异常,此时得到的是多列布尔值组成的DataFrame,才需要用any(axis=1)按行聚合判断是否存在任意一列异常,示例如下:
# 多列异常过滤示例 df_boyd_out = df_boyd[~( ((df_boyd['MTTR'] < (Q1_mttr - 1.5 * IQR_mttr)) | (df_boyd['MTTR'] > (Q3_mttr + 1.5 * IQR_mttr))) | ((df_boyd['MTBF'] < (Q1_mtbf - 1.5 * IQR_mtbf)) | (df_boyd['MTBF'] > (Q3_mtbf + 1.5 * IQR_mtbf))) ).any(axis=1)]
内容的提问来源于stack exchange,提问作者JRT5933
相关产品推荐
相关产品推荐

