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

