gpt4 book ai didi

python - 执行引用同一列中先前值的计算

转载 作者:太空宇宙 更新时间:2023-11-04 04:36:25 25 4
gpt4 key购买 nike

我有一个试图从 Excel 电子表格复制的数据框。它有一个值列表,在最后一列中,公式应该是如果 RunningTotal = Max 那么该值应该是 0。如果 Max 等于 max.shift(1) 那么该值应该是 Diff 的最小值列和 MaxDraw 列的前一个值。

list = [-350,   1350,   300,    300,    -500,   -100,   -550,   1450,
-3900, -1150, 4150, -1900, 1700, 7750, -3050, -1450, -1850, 4250]
df = pd.DataFrame(data=list, columns=['Values'])
df['RunningTotal'] = df['Values'].cumsum()
df['Max'] = df['RunningTotal'].cummax()
df['Diff'] = df['RunningTotal']-df['Max']
df['MaxDraw'] = np.where(df['RunningTotal'] == df['Max'], 0,
np.where(df['Max'] == df['Max'].shift(1),
**np.minimum(df['MaxDraw'].shift(1)**, df['Max']), np.nan))

双星代码片段是我尝试过的,但它看起来无法引用我正在定义的行中的值。我试过做一个临时列,但我需要以前的值才能得到最终结果。

预期结果应与下面的 MaxDraw 列匹配。

Vales   Running Total   Max MaxDraw
-350 -350 NA NA
1350 1000 1000 0
300 1300 1300 0
300 1600 1600 0
-500 1100 1600 -500
-100 1000 1600 -600
-550 450 1600 -1150
1450 1900 1900 0
-3900 -2000 1900 -3900
-1150 -3150 1900 -5050
4150 1000 1900 -5050
-1900 -900 1900 -5050
1700 800 1900 -5050
7750 8550 8550 0
-3050 5500 8550 -3050
-1450 4050 8550 -4500
-1850 2200 8550 -6350
4250 6450 8550 -6350

D3 中的 excel 公式是=IF(A3="","",IF(C3=B3,0,IF(C3=C2,MIN(B3-C3,D2))))

任何帮助将不胜感激,因为我已经为此苦苦思索了很长一段时间!

编辑:


在尝试保持此矢量化且不必使用迭代时 - 如果最大列不等于最大列的前一行,是否有一个解决方案可以利用 np.where 并说值为 0 -否则返回差异列的运行最小值,直到最大列再次更改?

最佳答案

您需要在此处使用显式 for 循环:

m = []
for i in df.index:
if df.iloc[i,1]==df.iloc[i,2]:
m.append(df.iloc[i,3])
else:
m.append(min(m[i-1],df.iloc[i,3]))

df["MAXDRAW"]=m
df
Values RunningTotal Max Diff MAXDRAW
0 -350 -350 -350 0 0
1 1350 1000 1000 0 0
2 300 1300 1300 0 0
3 300 1600 1600 0 0
4 -500 1100 1600 -500 -500
5 -100 1000 1600 -600 -600
6 -550 450 1600 -1150 -1150
7 1450 1900 1900 0 0
8 -3900 -2000 1900 -3900 -3900
9 -1150 -3150 1900 -5050 -5050
10 4150 1000 1900 -900 -5050
11 -1900 -900 1900 -2800 -5050
12 1700 800 1900 -1100 -5050
13 7750 8550 8550 0 0
14 -3050 5500 8550 -3050 -3050
15 -1450 4050 8550 -4500 -4500
16 -1850 2200 8550 -6350 -6350
17 4250 6450 8550 -2100 -6350

如果你需要一个函数,那么可以使用 itertools.accumulate

list(itertools.accumulate([df.iloc[0,3]]+df.iloc[1:].values.tolist(),lambda x,y:y[3] if y[1]==y[2] else min(x,y[3])))

这也和functools.reduce有关

 functools.reduce(lambda x,y:x+[y[3]]if y[1]==y[2] else x+[min(x[-1],y[3])],df.iloc[1:].values.tolist(),[df.iloc[0,3]])

关于python - 执行引用同一列中先前值的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51599191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com