You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用前后10个非0值均值替换pandas DataFrame中的0值

解决方案

方法1:滚动窗口平均法(完全匹配前后各10个非0值平均的需求)

该方案全部使用pandas内置向量化操作,没有循环,处理10万行以内的数据集效率极高。

  • 第一步:将0值替换为NaN,标记为待填充的缺失值,方便后续计算自动跳过无效值
import pandas as pd
df['Consumption'] = df['Consumption'].replace(0, float('nan'))
  • 第二步:计算前向、后向各10个非0值的平均,填充缺失位置
# 计算当前位置之前最近10个非0值的平均,min_periods=1表示不足10个时用现有可用值计算
forward_avg = df['Consumption'].rolling(window=10, min_periods=1, ignore_na=True).mean()
# 倒序计算当前位置之后最近10个非0值的平均,再恢复顺序
backward_avg = df['Consumption'][::-1].rolling(window=10, min_periods=1, ignore_na=True).mean()[::-1]
# 用前后均值的平均值填充原0值位置
df['Consumption'] = df['Consumption'].fillna((forward_avg + backward_avg) / 2)

参数调整说明

  • 如果你要求必须凑够前后各10个非0值才做替换,不足的位置保留原值,把min_periods参数改为10即可,计算后如果存在未填充的NaN,再按需转回0即可。
  • ignore_na=True保证滚动计数只统计非0值,不会把原0值计入窗口统计,完全匹配需求。

方法2:插值法(平滑填充场景适用,代码更简洁)

如果你不需要严格取前后10个值的平均,仅需要平滑填充0值,可以使用内置插值方法,运算速度更快:

df['Consumption'] = df['Consumption'].replace(0, float('nan')).interpolate(method='linear', limit_direction='both')

该方法会根据前后非0值做线性插值,适合数值变化比较平滑的业务场景。

内容的提问来源于stack exchange,提问作者lalaland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:15:08