如何向量化实现Pandas DataFrame新增列y=x+剩余行n的求和?
向量化实现Pandas中当前行到末尾的求和并生成新列
我需要在小型DataFrame df 中创建新列y,y的值为x列加上n列从当前行到最后一行的求和:第一行用df.n.sum(),第二行用df.n.iloc[1:].sum(),以此类推。希望用向量化方式实现,避免for循环。
原始代码示例:
import pandas as pd df = pd.DataFrame({'n':[4,5,6,7,8,9], 'x':[1,2,3,4,5,6]}) # 目前的尝试(不符合需求) df['y'] = df.x + df.n.sum() #?
通过for循环实现的预期求和结果:
output = [df.n.iloc[i:].sum() for i in range(len(df))] print(output) # 输出: [39, 35, 30, 24, 17, 9]
向量化实现方案
核心思路是利用Pandas的cumsum()方法,通过反转序列计算从当前行到末尾的累积和,再与x列相加得到y列。
代码实现:
import pandas as pd df = pd.DataFrame({'n':[4,5,6,7,8,9], 'x':[1,2,3,4,5,6]}) # 计算n列从当前行到末尾的求和(向量化方式) n_rev_cumsum = df['n'][::-1].cumsum()[::-1] # 生成目标列y df['y'] = df['x'] + n_rev_cumsum print(df)
输出结果:
n x y 0 4 1 40 1 5 2 37 2 6 3 33 3 7 4 28 4 8 5 22 5 9 6 15
原理说明
df['n'][::-1]:将n列的顺序反转,得到[9,8,7,6,5,4].cumsum():对反转后的序列计算累积和,得到[9,17,24,30,35,39][::-1]:再次反转,得到原序列中从当前行到末尾的求和结果[39,35,30,24,17,9]- 最后将该结果与
x列逐行相加,得到目标列y
这种方式完全基于Pandas的向量化操作,避免了Python循环的性能损耗,在数据量较大时优势尤为明显。
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

