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

基于布尔序列分组并实现前后填充的Pandas数据处理需求

问题

有一个Pandas DataFrame,需要基于布尔序列df['condition']执行前向/后向填充操作。分组规则为:一组包含连续的True值,以及用于分隔不同组的终止False值。

输入数据

import numpy as np
import pandas as pd

condition_values = [True, True, True, False, True, True, False, True,
                    True, False, True, True, True]
value_values = [0.1, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
                np.nan, np.nan, 0.5, np.nan, 0.9, np.nan]

data = {'condition': condition_values,
        'value': value_values}
df = pd.DataFrame(data)

初始DataFrame:

condition  value
0        True    0.1
1        True    NaN
2        True    NaN
3       False    NaN
4        True    NaN
5        True    NaN
6       False    NaN
7        True    NaN
8        True    NaN
9       False    0.5
10       True    NaN
11       True    0.9
12       True    NaN

期望输出

condition_values = [True, True, True, False, True, True, False, True, True, 
                    False, True, True, True]
value_values = [0.1,0.1, 0.1, 0.1, np.nan, np.nan, np.nan, 0.5, 0.5, 0.5, 
                0.9, 0.9, 0.9]

data = {'condition': condition_values,
        'value': value_values}
df2 = pd.DataFrame(data)

结果DataFrame:

condition  value
0        True    0.1
1        True    0.1
2        True    0.1
3       False    0.1
4        True    NaN
5        True    NaN
6       False    NaN
7        True    0.5
8        True    0.5
9       False    0.5
10       True    0.9
11       True    0.9
12       True    0.9

此前尝试按False拆分DataFrame再填充拼接,效率较低,需更高效的实现方式或思路提示。

解决方案

核心思路

  • 标记分组边界:识别condition列中True转False的位置,将连续True序列+后续第一个终止False划分为同一组。
  • 组合填充逻辑:对每个分组先执行反向填充(bfill),让组内有效数值覆盖后续位置,再执行正向填充(ffill),覆盖组内前置位置,确保整组(含终止False行)被统一填充。

高效实现代码

import numpy as np
import pandas as pd

# 构建输入DataFrame
condition_values = [True, True, True, False, True, True, False, True,
                    True, False, True, True, True]
value_values = [0.1, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,
                np.nan, np.nan, 0.5, np.nan, 0.9, np.nan]
df = pd.DataFrame({'condition': condition_values, 'value': value_values})

# 生成分组标签:将连续True+后续终止False归为同一组
group_ids = (df['condition'].shift(1) & ~df['condition']).cumsum()
group_ids = group_ids.where(df['condition'] | df['condition'].shift(-1), group_ids - 1)

# 按分组执行反向+正向填充
df['value'] = df.groupby(group_ids)['value'].apply(lambda x: x.bfill().ffill())

print(df)

代码说明

  • 分组标签生成:通过df['condition'].shift(1) & ~df['condition']定位True转False的边界,用cumsum()生成初始分组ID;再调整分组,让孤立的False行(不属于任何True组的终止行)归到前一个有效组。
  • 组内填充:bfill()先让组内的非NaN值覆盖后续位置,ffill()再将该值覆盖组内所有前置NaN位置,一次完成整组的填充操作,无需拆分拼接DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:32:27