使用while循环计算连续均值时出现NaN问题及优化需求
问题解决与优化方案
循环错误原因及修复
你的循环后续输出NaN是因为索引更新逻辑错误:
- 初始
i=0,j=20,第一次取0:20是21行(loc是闭区间,包含两端索引) - 错误的更新语句
i += j + 1会让i跳变到21,下一次j=40,取21:40是20行,但再下一次i=21+40+1=62,j=60,此时i>j,data.loc[i:j]返回空DataFrame,均值自然为NaN。
修复后的循环代码:
import numpy as np mean_list = [] i = 0 batch_size = 20 total_rows = df.shape[0] while i < total_rows: # 取从i开始的最多batch_size行,兼容最后一批不足20行的情况 end_idx = min(i + batch_size - 1, total_rows - 1) data_1 = df.loc[i:end_idx, "RATED_TORQUE_ACTUAL"] mean = np.mean(data_1) mean_list.append(round(mean, 2)) # 每次步进batch_size行,确保索引连续 i += batch_size print(mean_list)
额外说明:
- 无需每次复制整个DataFrame,直接切片目标列即可,节省内存
- 用
min()处理最后一批行数不足20的边界情况
更优方案:用Pandas原生分组实现
Pandas的groupby可以更简洁高效地完成批量均值计算,完全替代手动循环:
# 按每20行分组,计算指定列均值并保留2位小数 mean_list = df.groupby(df.index // 20)["RATED_TORQUE_ACTUAL"].mean().round(2).tolist()
原理:
df.index //20会把索引0-19映射为0,20-39映射为1,以此类推,自动实现每20行一组- 原生分组方法代码更简洁,性能比手动循环更优,还能自动处理最后一批不足20行的情况
另外补充:你筛选CELLNO=1后df.shape仍为(1271,19),说明原数据所有行的CELLNO都是1,这一步筛选可以省略。
内容的提问来源于stack exchange,提问作者ThunderBolt_23
相关产品推荐
相关产品推荐

