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

pandas基于上一行数据更新MID列,使用shift方法未得到预期输出

问题原因

你直接用.shift()没得到预期结果,是因为pandas的向量化操作是一次性读取原始列的所有值计算,不会读取迭代过程中刚更新的上一行MID值,所以只能拿到初始的nan值参与计算,自然结果不对。

实现方法

方法1:累加和实现(性能最优,适合大数据量)

你给出的期望输出对应的规则可转换为初始MID值 + 前n-1行RefID的累加和,直接用cumsum实现即可:

import pandas as pd
import numpy as np

# 构造测试数据,可替换为自己的DataFrame
df = pd.DataFrame({
    'CID': [100,100,100,100],
    'RefID': [1,2,3,4],
    'Date': ['1/01/2021','3/01/2021','4/01/2021','15/01/2021'],
    'Group': ['A','A','A','A'],
    'MID': [101, np.nan, np.nan, np.nan]
})

# 核心计算逻辑
start_mid = df['MID'].iloc[0]
df['MID'] = start_mid + df['RefID'].shift(1).fillna(0).cumsum()

如果你的迭代规则确实是上一行MID值 + 当前行RefID值 = 当前行MID值,只需要把核心逻辑改为df['MID'] = start_mid + df['RefID'].cumsum() - df['RefID'].iloc[0]即可。

方法2:逐行迭代(通用方案,适合复杂迭代规则)

如果你的迭代规则更复杂,没法转换为累加和逻辑,可以直接逐行遍历计算:

for i in range(1, len(df)):
    # 按实际需要的规则调整计算式即可
    df.loc[i, 'MID'] = df.loc[i-1, 'MID'] + df.loc[i-1, 'RefID']

输出结果

两种方法得到的结果都和你要求的一致:

CIDRefIDDateGroupMID
10011/01/2021A101
10023/01/2021A102
10034/01/2021A104
100415/01/2021A107

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:06:02