假设我有以下数据帧
A B C
5 1 0.7
7 1 0.7
-1 1 0.7
-3 1 0.7
12 1 0.7
我想把A和B相乘,或者A和C相乘,基于之前乘法的累积和。
第一次迭代,总和为0,所以我们将A和B相乘得到
A B C cum sum
5 1 0.7 5
7 1 0.7
-1 1 0.7
-3 1 0.7
12 1 0.7
总和小于10,所以我们再将A与B相乘,得到
A B C cum sum
5 1 0.7 5
7 1 0.7 12
-1 1 0.7
-3 1 0.7
12 1 0.7
现在总和大于10,因此我们将A和C相乘得到
A B C cum sum
5 1 0.7 5
7 1 0.7 12
-1 1 0.7 11.3
-3 1 0.7
12 1 0.7
继续,预期的输出将是
A B C cum sum
5 1 0.7 5
7 1 0.7 12
-1 1 0.7 11.3
-3 1 0.7 9.2
12 1 0.7 21.2
a = {'A':[5, 7, -1, -3, 12]}
b = {'B': [1, 1, 1, 1, 1]}
c = {'C' : [0.7, 0.7, 0.7, 0.7, 0.7]}
a.update(b)
a.update(c)
df = pd.DataFrame.from_dict(a)
我怎样才能做到这一点?
for
循环可以工作
cs = [0]
for _, row in df.iterrows():
if cs[-1] > 10:
curr = cs[-1] + row.A * row.C
else:
curr = cs[-1] + row.A * row.B
cs += [curr]
pandas.Series(cs[1:])
# 0 5.0
# 1 12.0
# 2 11.3
# 3 9.2
# 4 21.2
# dtype: float64
另一种使用for
循环的方法,但不是使用自定义函数迭代a的值列表:
def filtered_cumsum(a, factor=0.7):
result = [a[0]]
for num in a[1:]:
result.append(result[-1]+num*(1 if result[-1]<10 else factor))
return result
df["cumsum"] = filtered_cumsum(df["A"].tolist())
>>> df
A cumsum
0 5 5.0
1 7 12.0
2 -1 11.3
3 -3 9.2
4 12 21.2
5 -78 -33.4
6 -98 -131.4
7 91 -40.4
8 32 -8.4
9 -7 -15.4
10 37 21.6
11 70 70.6