如何基于现有布尔列创建存储最近3次True对应索引的DataFrame列
匹配需求的可运行实现方案
核心逻辑完全对齐预设的填充规则:
- 遇到布尔值为
False的行,直接填充[None, None, None],不更新历史True的记录- 遇到布尔值为
True的行,先将当前行的索引存入历史记录列表- 历史记录列表长度不足3时,填充
[None, None, None]- 历史记录列表长度达到3及以上时,取列表最后3个元素作为当前行新列的值
代码实现
首先导入依赖并构造和示例一致的测试数据:
import pandas as pd # 构造匹配示例的测试数据 idx = pd.to_datetime(['2021-03-22', '2021-03-23', '2021-03-24', '2021-03-25', '2021-03-26']) bool_series = pd.Series([True, True, True, False, True], index=idx, name='is_true') df = pd.DataFrame(bool_series)
逐行处理生成目标新列:
# 维护按时间顺序排列的True索引历史列表 recent_trues = [] new_col_values = [] # 按索引顺序遍历每一行 for current_idx, is_truth in df['is_true'].items(): if not is_truth: # False行按规则填充空值列表,不更新历史 new_col_values.append([None, None, None]) continue # True行先把当前索引加入历史记录 recent_trues.append(current_idx) # 历史记录不足3个时填充空值列表 if len(recent_trues) < 3: new_col_values.append([None, None, None]) else: # 历史记录满3个以上时,取最后3个值填充 new_col_values.append(recent_trues[-3:]) # 将结果写入DataFrame新列 df['last_3_true_index'] = new_col_values
结果验证
运行代码后输出的DataFrame完全匹配你的示例要求:
is_true last_3_true_index 2021-03-22 True [None, None, None] 2021-03-23 True [None, None, None] 2021-03-24 True [2021-03-22, 2021-03-23, 2021-03-24] 2021-03-25 False [None, None, None] 2021-03-26 True [2021-03-23, 2021-03-24, 2021-03-26]
注意事项
- 若原始DataFrame的日期索引未按时间升序排列,需要先执行索引排序再运行逻辑,否则“最近3次True”的时间顺序会出错,排序代码为
df = df.sort_index() - 该实现的时间复杂度为O(n),即使是十万行以上的大表也可以快速完成计算,无需依赖复杂的窗口聚合逻辑
内容的提问来源于stack exchange,提问作者yash
相关产品推荐
相关产品推荐

