基于分组均值/std为DataFrame添加Weight异常值识别列遇歧义错误
解决异常值识别的报错问题
你的代码报错是因为在apply的lambda里,拿单个Weight值和整个Weight_Mean、Weight_std列做比较,生成的是布尔Series,而if语句无法判断整个Series的真值(无法确定是要求全True还是存在True即可),因此抛出"The truth value of a series is ambiguous"错误。
最优解决方案:矢量化运算(推荐)
直接用pandas的矢量化列操作,逐行对应计算,无需apply,效率更高:
# 生成布尔类型的异常值标记列 df2["Weight_Outlier"] = (df2["Weight"] > (df2["Weight_Mean"] + df2["Weight_std"] * 2.5)) | (df2["Weight"] < (df2["Weight_Mean"] - df2["Weight_std"] * 2.5)) # 如需转换为1/0的数值列 df2["Weight_Outlier"] = df2["Weight_Outlier"].astype(int)
备选方案:按行apply(不推荐,效率较低)
如果一定要用apply,需指定axis=1让函数按行处理,lambda参数为整行数据,取当前行的均值和标准差计算:
df2["Weight_Outlier"] = df2.apply( lambda row: row["Weight"] > (row["Weight_Mean"] + row["Weight_std"]*2.5) or row["Weight"] < (row["Weight_Mean"] - row["Weight_std"]*2.5), axis=1 )
这样就能生成所需的True/False标记列,后续可直接用于异常值分布分析或模型训练对比测试。
内容的提问来源于stack exchange,提问作者DLE
相关产品推荐
相关产品推荐

