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

Conditional forward fill场景下DataFrame过滤与填充需求

处理DataFrame特定区间行过滤与前向填充问题

原始DataFrame

data1data2data3data4
8822441
nannannan5
517nannannan
nannannannan
nan-33nannan
nannan8nan
nannannan0

需求说明

需要对该DataFrame执行前向填充(forward fill),但要求:当data4 == 5时,删除从该行开始直到data4值再次变化的所有行。

现有方案的问题

  • 若先执行前向填充再过滤data4 != 5,会导致data4=0的行带上517这类不符合预期的值
  • 直接使用filtereddf = df[df.data4 !=5]只能移除包含5的行,无法处理data4为5期间其他列有值的情况

预期结果

data1data2data3data4
8822441
8822440

解决方案

代码实现

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame({
    'data1': [88, np.nan, 517, np.nan, np.nan, np.nan, np.nan],
    'data2': [22, np.nan, np.nan, np.nan, -33, np.nan, np.nan],
    'data3': [44, np.nan, np.nan, np.nan, np.nan, 8, np.nan],
    'data4': [1, 5, np.nan, np.nan, np.nan, np.nan, 0]
})

# 定位需要排除的区间索引
start_idx = df[df['data4'] == 5].index[0]
end_idx = df[(df['data4'].notna()) & (df.index > start_idx)].index[0]

# 删除指定区间的行
filtered_df = df.drop(df.index[start_idx:end_idx])

# 执行前向填充
result_df = filtered_df.ffill()

print(result_df)

逻辑说明

  1. 先定位data4=5的起始索引,以及之后第一个data4非空值(即0)的结束索引
  2. 删除这两个索引之间的所有行(包含起始行,不包含结束行)
  3. 对过滤后的DataFrame执行前向填充,得到符合预期的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:53:18