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']
输出结果
两种方法得到的结果都和你要求的一致:
| CID | RefID | Date | Group | MID |
|---|---|---|---|---|
| 100 | 1 | 1/01/2021 | A | 101 |
| 100 | 2 | 3/01/2021 | A | 102 |
| 100 | 3 | 4/01/2021 | A | 104 |
| 100 | 4 | 15/01/2021 | A | 107 |
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

