如何仅对Pandas DataFrame子集执行运算以提升数据处理性能
Pandas仅计算最近N条滚动平均的高效实现方案
核心思路
跳过全量滚动遍历逻辑,直接对最后10条数据做切片聚合,所有操作仅涉及目标区间的数据读写,不会触发全量计算,也不需要修改原数据结构或创建新DataFrame。
适用场景1:仅需要得到最近10条的平均数值
直接用tail切片取数后计算均值即可,开销极小:
window_size = 10 # 仅读取最后10行的price列计算均值,不会遍历全量200行数据 last_10_avg = df['price'].tail(window_size).mean()
适用场景2:需要把均值写入原DataFrame最后一行
仅对最后一行的指定列赋值,不会修改其他行数据:
# 直接把计算结果赋值给原df最后一行的新列,无需新建df df.loc[df.index[-1], 'recent_10_avg'] = df['price'].tail(10).mean()
适用场景3:需要生成最后10行对应的滚动均值(第191~200行每行的10条滚动平均)
仅对最后19行做滚动计算,再把结果赋值回原df对应位置,避免全量运算:
window_size = 10 # 仅取最后 window_size*2 -1 行做滚动计算,保证最后10行的结果有效 partial_rolling = df['price'].iloc[-(window_size * 2 - 1):].rolling(window_size).mean() # 仅把最后10行的结果赋值回原df,不影响其他行数据 df.loc[partial_rolling.index[-window_size:], 'recent_10_avg'] = partial_rolling.iloc[-window_size:]
增量更新优化(适合高频新增数据的场景)
如果你的数据是持续新增的,不需要每次都重新计算最后10条的均值,用增量逻辑更新即可:
window_size = 10 # 首次计算初始窗口均值 current_avg = df['price'].tail(window_size).mean() # 新增价格数据new_price时,增量计算新的均值 new_price = 99.9 current_avg = current_avg - df['price'].iloc[-window_size]/window_size + new_price/window_size # 写入新数据和对应均值到原df df.loc[len(df)] = {'price': new_price, 'recent_10_avg': current_avg}
以上所有方案都满足保留全量原始数据、不创建新DataFrame的要求,计算量仅为全量滚动运算的5%不到,数据量越大性能优势越明显。
内容的提问来源于stack exchange,提问作者CosmicSeizure
相关产品推荐
相关产品推荐

