在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
相关产品推荐
相关产品推荐

