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

如何基于递推移位运算为Pandas DataFrame生成新列?

递推生成新列c的解决方案

你的需求是生成递推列c:以a列的第一个有效值为初始值,后续每行的c等于上一行的c减去当前行的b值。原代码仅使用a的移位值,无法实现递推依赖,以下是两种可行实现方式:

方法1:循环实现(直观,小数据集友好)

通过维护递推的当前值,逐行计算c:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [20, np.nan, np.nan], 'b': [np.nan, 3, 2]})

df['c'] = np.nan
current_val = df['a'].dropna().iloc[0]  # 获取初始值20.0

for idx in range(1, len(df)):
    b_val = df['b'].iloc[idx]
    if pd.notna(b_val):
        current_val -= b_val
        df.loc[idx, 'c'] = current_val

输出结果:

a    b     c
0  20.0  NaN   NaN
1   NaN  3.0  17.0
2   NaN  2.0  15.0

方法2:numpy累积求和实现(高效,大数据集友好)

利用np.cumsum计算b列非空值的累积和,再用初始值减去该累积和,直接映射到对应行:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [20, np.nan, np.nan], 'b': [np.nan, 3, 2]})

df['c'] = np.nan
start_val = df['a'].dropna().iloc[0]
b_valid = df['b'].dropna()

# 计算累积差值序列
cum_diff = start_val - np.cumsum(b_valid)
# 将结果赋值到c列的对应位置
df.loc[b_valid.index, 'c'] = cum_diff

此方法避免循环,处理大规模数据时性能更优,输出与方法1一致。

原代码问题分析

df['c'] = df['a'].shift(1) - df.b仅引用上一行的a值,而非前一行计算出的c值:第三行的a.shift(1)是NaN,导致结果为NaN,无法满足递推要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:36