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

如何在Python Pandas DataFrame中通过滚动窗口实现特定插值填充?

解决思路:逐行处理列窗口,替换0值

核心思路是针对每行的指定4列窗口,对目标列(-6.704)的0值进行定向替换:若目标列是0,就从窗口内找右侧第一个非0值替换;窗口全0则保留0。

步骤1:明确窗口列范围

先确定窗口包含的4列,假设你的列按时序从左到右为-6.704, -6.696, -6.688, -6.672,定义窗口列列表:

window_cols = ['-6.704', '-6.696', '-6.688', '-6.672']

步骤2:高效处理方案(向量化优先)

如果数据量较大,优先用向量化方法,比逐行apply效率高很多:

# 提取窗口内的列作为子数据框
window_df = df[window_cols]
# 对每行从左到右用右侧非0值填充(bfill(axis=1)),取第一列(目标列)的填充结果
filled_values = window_df.bfill(axis=1).iloc[:, 0]
# 替换原目标列的0值,非0值保留原值
df['-6.704'] = df['-6.704'].where(df['-6.704'] != 0, filled_values)

bfill(axis=1)会自动为每行的0值填充其右侧第一个非0值,窗口全0的行填充后仍为0,完全匹配你的需求。

备选:逐行处理函数(小数据量适用)

如果需要更灵活的自定义逻辑,可编写逐行处理函数:

def fill_target_zero(row):
    target_col = '-6.704'
    # 目标列非0直接返回
    if row[target_col] != 0:
        return row[target_col]
    # 遍历窗口列,找第一个非0值
    for col in window_cols:
        if row[col] != 0:
            return row[col]
    # 全0则返回0
    return 0

# 应用到数据框
df['-6.704'] = df.apply(fill_target_zero, axis=1)

为什么不用rolling?

rolling方法是针对行方向的滚动计算(比如滑动均值、求和),而你的需求是行内的列窗口查找,属于列维度的行操作,rolling的参数逻辑并不适配这种场景,用向填充或逐行apply更直接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:05:20