无NaN却出现“Mean of empty slice”警告的原因及解决办法
问题原因
你这段代码的警告核心是布尔索引的对齐错误:
你用的keptdata.price != 0是针对整个原DataFrame的布尔筛选条件,但前面的keptdata.iloc[i-500:i].price只是原数据的一个子切片。当用全局的布尔序列去筛选子切片的列时,两者的索引范围不匹配,会导致筛选后可能出现空的数值序列——np.average遇到空序列就会抛出RuntimeWarning: Mean of empty slice的警告,哪怕你确认了原数据无NaN也没用。
解决办法
除了抑制警告,有几个更合理的修正方式:
修正布尔索引的范围:把非零判断限定在当前截取的子切片里,确保筛选条件和目标列的索引完全匹配:
avg = np.average(keptdata.iloc[i-500:i].price[keptdata.iloc[i-500:i].price != 0])这样只会筛选子切片里的非零price,不会出现索引错位导致的空序列(如果子切片里全是0,那你可以根据业务逻辑加个兜底判断,比如设avg为0或者前一次的平均值)。
改用Pandas的mean方法替代np.average:Pandas的
mean()方法遇到空序列时会返回NaN,不会抛出警告,之后你可以根据需求处理NaN值:subset_price = keptdata.iloc[i-500:i].price[keptdata.iloc[i-500:i].price != 0] avg = subset_price.mean() if not subset_price.empty else 0 # 这里的0可以换成你需要的默认值提前生成子切片再操作:先截取子DataFrame,再统一处理,代码可读性更高:
subset = keptdata.iloc[i-500:i] non_zero_prices = subset[subset.price != 0]['price'] avg = np.average(non_zero_prices) if not non_zero_prices.empty else 0
内容的提问来源于stack exchange,提问作者Allure
相关产品推荐
相关产品推荐

