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

如何基于筛选索引及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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:00:20