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

Pandas布尔列处理:将True后设至少N个False(向量化实现)

解决Pandas布尔列强制True后至少N个False的高效方法

要实现每个True后至少跟随N个False,同时确保最后N行均为False,可通过以下兼顾性能与可读性的方式处理:

核心思路

  1. 提取原始布尔列中所有True的位置,过滤掉最后N行的True(这类True无法满足后续有N个False的要求)。
  2. 筛选保留的True位置:确保每个保留的True与前一个保留的True之间至少间隔N+1个位置(即中间有N个False)。
  3. 根据筛选出的位置生成新布尔列。

代码实现

import pandas as pd
import numpy as np

def enforce_min_false_after_true(df, col_name, N):
    bool_values = df[col_name].values
    total_rows = len(bool_values)
    
    # 处理空数据集
    if total_rows == 0:
        return pd.Series([], index=df.index)
    
    # 获取所有原始True的位置索引
    true_positions = np.where(bool_values)[0]
    
    # 过滤掉最后N行的True(无法满足后续N个False的要求)
    valid_true_pos = true_positions[true_positions <= total_rows - 1 - N]
    
    # 无有效True则返回全False列
    if len(valid_true_pos) == 0:
        return pd.Series(False, index=df.index)
    
    # 筛选符合间隔要求的True位置
    kept_positions = [valid_true_pos[0]]
    last_kept = valid_true_pos[0]
    
    for pos in valid_true_pos[1:]:
        # 当前True与上一个保留True的间隔至少为N+1
        if pos >= last_kept + N + 1:
            kept_positions.append(pos)
            last_kept = pos
    
    # 生成新布尔列
    new_col = np.zeros(total_rows, dtype=bool)
    new_col[kept_positions] = True
    
    return pd.Series(new_col, index=df.index)

测试示例

# 构造测试数据
df = pd.DataFrame({
    'bool_col': [False, True, False, False, True, True, False, True, False, True, True, False, False]
})

# 调用函数,设置N=2
df['new_col'] = enforce_min_false_after_true(df, 'bool_col', N=2)

print(df['new_col'].tolist())
# 输出结果:[False, True, False, False, True, False, False, True, False, False, True, False, False]

说明

  • 该方法通过先提取True位置再筛选的方式,避免了逐行遍历整个数据集,性能接近纯向量化处理(True数量通常远小于总数据量)。
  • 自动处理空数据、无有效True等边界场景。
  • 严格保证最后N行均为False,且每个保留的True后至少有N个False。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:52:36