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

