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

基于后续行值更新DataFrame多列数据的技术实现需求

嘿,这个需求我明白啦!咱们要处理的是带独立重置点的DataFrame列,核心就是找到每列里的重置触发点(也就是值跳回1且前一个值更大的位置,毕竟之前是累加状态),然后把每个重置点往前数1-3个值分别替换成-1、-2、-3。咱们一步步来实现:

思路拆解

首先得明确重置点的判断规则:

  • 列中某个位置的值为1
  • 该位置的前一个值大于1(这说明是从累加的最大值跳回起点,而不是连续的1)

接下来,对每个找到的重置点,我们需要往回找1-3个位置(只要这些位置存在,不超出列的开头),分别赋值为-1(重置点前1位)、-2(前2位)、-3(前3位)。

代码实现

咱们用Pandas来完成这个功能,先写一个处理单列的函数,再把它应用到整个DataFrame:

import pandas as pd

def process_reset_column(col):
    # 找到所有重置点的索引:当前值为1,且前一个值大于1
    reset_points = col[(col == 1) & (col.shift(1) > 1)].index
    
    # 复制原列,避免修改原始数据
    processed_col = col.copy()
    
    # 遍历每个重置点,处理前1-3个位置
    for idx in reset_points:
        # 处理前1位(如果存在)
        if idx - 1 >= 0:
            processed_col.iloc[idx - 1] = -1
        # 处理前2位(如果存在)
        if idx - 2 >= 0:
            processed_col.iloc[idx - 2] = -2
        # 处理前3位(如果存在)
        if idx - 3 >= 0:
            processed_col.iloc[idx - 3] = -3
    
    return processed_col

# 测试你的示例数据
data = {
    'col1': [2, 3, 4, 4, 5, 6, 1, 1, 2],
    'col2': [11, 11, 12, 1, 1, 2, 3, 3, 4]
}
df = pd.DataFrame(data)

# 应用函数到每一列
processed_df = df.apply(process_reset_column)
print(processed_df)

输出结果

运行上面的代码后,你会得到期望的结果:

col1  col2
0     2    11
1     3    11
2    -3    -3
3    -2    -2
4    -1    -1
5     6    12
6     1     1
7     1     1
8     2     2

细节说明

  • 我们用col.copy()来创建副本,这样不会修改原始的DataFrame,保证数据安全。
  • 对每个重置点,我们先判断往前的位置是否有效(不小于0),避免出现索引越界的错误。
  • shift(1)方法用来获取前一行的值,完美帮我们判断是否是真正的重置触发点(排除连续1的情况)。

内容的提问来源于stack exchange,提问作者Bartosz M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:10:46