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

在Pandas中查找first列为True的行后首个second为True的行(无循环优先)

解决方案

可以通过分组标记+组内筛选的方式实现,完全避免for循环,步骤如下:

步骤1:生成分组标签

先给每个first为True的行及其后续行分配同一个组ID,把每个目标行(first=True)之后的所有行归为一组:

import pandas as pd

df = pd.DataFrame(
    {
        'first': [True, False, True, False, False, False, True, False], 
        'second': [False, True, True, False, True, True, False, False]
    }
)

# 生成组ID:每次遇到first=True时组号递增
df['group'] = df['first'].cumsum()

步骤2:排除每组的起始行(即first=True的行本身)

我们只需要处理目标行之后的行,所以先过滤掉每组的第一行:

# 筛选出每组中除第一个行之外的所有行
filtered = df[df.index != df.groupby('group')['index'].transform('first')]

步骤3:提取每组中首个second=True的行

对每个分组,筛选出second=True的行,然后取每组的第一行,最后去掉临时的group列:

# 按组筛选首个second=True的行
result = filtered[filtered['second']].groupby('group').first().reset_index(drop=True)
# 移除临时的group列
result = result.drop(columns='group')

执行后result的输出为:

first  second
0  False    True
1  False    True

另一种实现方式(基于Numpy向量操作)

如果偏好更底层的向量运算,也可以用Numpy实现:

import numpy as np

# 获取所有first=True的行索引
true_first_idx = df[df['first']].index.values
# 生成掩码矩阵:判断每个目标行之后的行是否满足second=True
mask = (df.index.values > true_first_idx[:, np.newaxis]) & df['second'].values
# 找出每个目标行对应的首个匹配行索引
match_idx = df.index.values[np.argmax(mask, axis=1)]
# 过滤掉无匹配的情况并去重(避免多个目标行匹配到同一行)
valid_mask = mask.any(axis=1)
final_idx = np.unique(match_idx[valid_mask])
# 提取结果
result = df.loc[final_idx].sort_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:09:15