如何基于DataFrame实现示例所示的迭代计算?求参考链接
迭代计算DataFrame的正确实现方法
需求规则
- df2的第0行完全沿用df1的第0行数据
- 从第1行开始,df2每行的每个值遵循公式:
df2.iloc[i] = df1.iloc[i] * 2 + df2.iloc[i-1] * 1
示例数据
df1原始数据
a b c 0 1 0 5 1 9 9 2 2 2 2 8 3 6 3 0 4 6 1 7
目标df2结果
a b c 0 1 0 5 # 取自df1第0行 1 19 18 9 # 计算逻辑:(9*2)+1=19,(9*2)+0=18,(2*2)+5=9 2 23 22 25 # 计算逻辑:(2*2)+19=23,(2*2)+18=22,(8*2)+9=25 3 35 28 25 # 计算逻辑:(6*2)+23=35,(3*2)+22=28,(0*2)+25=25 4 47 30 39 # 计算逻辑:(6*2)+35=47,(1*2)+28=30,(7*2)+25=39
原有代码问题分析
你之前的代码里,循环内的公式错误地将df2.values[i-1]的乘数设为3,不符合需求里的×1规则,这是导致结果错误的核心原因。
原有代码:
import pandas as pd df1 = pd.DataFrame({'a': [1,9,2,6,6], 'b': [0,9,2,3,1], 'c': [5,2,8,0,7]}) df2 = pd.DataFrame(index=df1.index, columns=df1.columns) df2.iloc[0] = df1.iloc[:1] size = len(df1.index) for i in range(1,size): df2.values[i] = ((df1.values[i] * 2) + (df2.values[i-1] * 3)) # 此处乘数3错误,应为1
正确实现方法
方法1:修正循环逻辑
直接修正公式中的乘数,同时简化赋值方式:
import pandas as pd df1 = pd.DataFrame({'a': [1,9,2,6,6], 'b': [0,9,2,3,1], 'c': [5,2,8,0,7]}) df2 = df1.copy() # 直接复制第0行,无需单独赋值 for i in range(1, len(df1)): df2.iloc[i] = df1.iloc[i] * 2 + df2.iloc[i-1] print(df2)
运行后会输出符合要求的df2结果。
方法2:向量化实现(无显式循环)
将问题转化为累积权重计算,避免循环提升效率,适合大数据量场景:
import pandas as pd import numpy as np df1 = pd.DataFrame({'a': [1,9,2,6,6], 'b': [0,9,2,3,1], 'c': [5,2,8,0,7]}) n = len(df1) # 构造权重矩阵:每行i对应df1行j的权重为2*1^(i-j)(j<=i),第一行仅df1[0]权重为1 weights = np.array([[2 * (1 ** (i - j)) if j <= i else 0 for j in range(n)] for i in range(n)]) weights[0,0] = 1 df2 = pd.DataFrame(df1.values.T @ weights.T, index=df1.index, columns=df1.columns) print(df2)
内容的提问来源于stack exchange,提问作者stvlam22
相关产品推荐
相关产品推荐

