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

Pandas中基于‘左、中、右’列模式提取行内[True, False, True]连续列数据

Pandas中基于‘左、中、右’列模式提取行内[True, False, True]连续列数据

嘿,我来帮你搞定在Pandas行里提取[True, False, True]连续列模式的问题!先明确下需求:我们要找的是左列True、中间列False、右列True的连续三列组合,对吧?

先结合你给出的示例数据处理流程,我给你梳理一套可行的解决方案:

第一步:先把你的数据加载好(按你的示例)

首先确保数据加载和预处理的代码没问题,这里我调整了下避免链式索引的警告:

import pandas as pd
import numpy as np

# 加载并预处理数据
df = pd.read_csv('My_Boxes.csv')
pd.set_option('display.max_columns', None)
df = df.drop(columns=['Unnamed: 0'])
# 截取7-9行,用copy避免后续操作的警告
target_df = df.loc[7:9].copy()

第二步:用向量化方法检测[True, False, True]模式

向量化操作比循环高效得多,我们可以利用Pandas的shift方法来对比相邻列:

# 定义我们要匹配的目标模式
target_pattern = [True, False, True]

# 生成掩码:标记出每一行中符合模式的中间列(也就是False所在的列)
# shift(axis=1) 把列向左移一位,得到当前列的左列数据;shift(periods=-1, axis=1) 向右移一位,得到右列数据
pattern_mask = (target_df.shift(axis=1) == target_pattern[0]) & \
               (target_df == target_pattern[1]) & \
               (target_df.shift(periods=-1, axis=1) == target_pattern[2])

第三步:提取符合条件的三列数据

有了掩码后,我们就可以遍历每一行,找到所有符合条件的三列组合,并把它们提取出来:

# 用来存储结果的列表
extracted_results = []

# 遍历每一行的掩码和原始数据
for row_idx, mask_row in pattern_mask.iterrows():
    # 找到当前行中符合条件的中间列
    matched_middle_cols = mask_row[mask_row].index
    for middle_col in matched_middle_cols:
        # 获取左、中、右三列的列名
        col_position = target_df.columns.get_loc(middle_col)
        left_col = target_df.columns[col_position - 1]
        right_col = target_df.columns[col_position + 1]
        # 提取这三列的具体数据
        trio_values = target_df.loc[row_idx, [left_col, middle_col, right_col]].tolist()
        # 把结果存入列表
        extracted_results.append({
            '行索引': row_idx,
            '左列名称': left_col,
            '中列名称': middle_col,
            '右列名称': right_col,
            '三列数据': trio_values
        })

# 把结果转换成DataFrame,方便查看和后续处理
result_df = pd.DataFrame(extracted_results)
print(result_df)

额外小提示

如果你的原始数据列不是布尔类型(比如是0/1或者其他数值),可以先把列转换成布尔型再执行上面的步骤:

# 把数据列转换成布尔类型(假设0对应False,非0对应True)
target_df_bool = target_df.astype(bool)
# 之后用target_df_bool替换上面的target_df即可

如果某一行没有符合条件的三列组合,result_df就会是空的,你可以用if not result_df.empty来判断是否有匹配结果。

备注:内容来源于stack exchange,提问作者Bheki Shongwe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 15:59:33