基于布尔序列分组并实现前后填充的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
相关产品推荐
相关产品推荐

