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

如何基于现有布尔列创建存储最近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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 02:57:07