如何基于筛选索引及shift()修改Pandas DataFrame指定列值?
解决方案
步骤1:筛选C列为True的行得到df2
直接通过布尔索引筛选,保留原DataFrame的索引以便后续关联:
df2 = df[df['C']].copy()
步骤2:在df2中找出A列连续三行递增的所有行
通过判断相邻行的递增关系,识别出构成连续三行递增的所有行:
# 标记A列后一行比前一行大的行 is_increasing = df2['A'].diff() > 0 # 标记连续两次递增的行(即当前行是连续三行递增的第三行) three_row_incr = is_increasing & is_increasing.shift(1) # 获取所有连续三行递增序列的第三行索引 third_row_indices = df2[three_row_incr].index # 收集序列中所有行的索引(第三行、第二行、第一行) target_df2_indices = set() for idx in third_row_indices: for offset in (-2, -1, 0): current_idx = idx + offset if current_idx in df2.index: target_df2_indices.add(current_idx) # 得到df3 df3 = df2.loc[sorted(target_df2_indices)]
步骤3:在原df的B列标记目标行
基于df3的索引,将每个索引及其前2行(若存在)的B列设为True:
# 初始化B列(如果原df没有B列的话) if 'B' not in df.columns: df['B'] = False # 收集所有需要标记的原df索引 final_target_indices = set() for idx in df3.index: for offset in (-2, -1, 0): current_idx = idx + offset if current_idx in df.index: final_target_indices.add(current_idx) # 标记B列为True df.loc[sorted(final_target_indices), 'B'] = True
简化版高效实现
如果追求代码简洁性,可用numpy批量处理索引:
import numpy as np # 步骤1 df2 = df[df['C']].copy() # 步骤2 is_increasing = df2['A'].diff() > 0 three_row_incr = is_increasing & is_increasing.shift(1) third_row_indices = df2[three_row_incr].index.to_numpy() # 生成df3的所有索引 df3_indices = np.concatenate([third_row_indices - 2, third_row_indices - 1, third_row_indices]) df3_indices = df3_indices[np.isin(df3_indices, df2.index)] df3_indices = np.unique(df3_indices) df3 = df2.loc[df3_indices].sort_index() # 步骤3 final_indices = np.concatenate([df3_indices - 2, df3_indices - 1, df3_indices]) final_indices = final_indices[np.isin(final_indices, df.index)] final_indices = np.unique(final_indices) df['B'] = df['B'].astype(bool) # 确保B是布尔类型 df.loc[final_indices, 'B'] = True
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

