三列A B C,取A*B,当总和小于10时取A*C

  • 本文关键字:小于 10时取 三列 python pandas
  • 更新时间 :
  • 英文 :


假设我有以下数据帧

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

最新更新