如何用前后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
相关产品推荐
相关产品推荐

