【发布时间】:2021-11-07 22:18:30
【问题描述】:
我试图在 pandas 中找到一个矢量化解决方案,这在电子表格中很常见,即在根据实际 cumsum 的结果跳过或设置条件的固定值时进行 cumsum。我有以下内容:
A
1 0
2 -1
3 2
4 3
5 -2
6 -3
7 1
8 -1
9 1
10 -2
11 1
12 2
13 -1
14 -2
我需要添加第二列,其 cumsum 为“A”,如果其中一个和为正值,则将其替换为 0,并使用该 0 继续 cumsum。同时,如果 cumsum 给出负值低于 B 列 0 之后记录的 A 列最小值我需要用 A 列中的最低值替换它。我知道这是一个很大的问题,但是有一个矢量化解决方案吗?也许使用辅助列。结果应如下所示:
A B
1 0 0
2 -1 -1 # -1+0 = -1
3 2 0 # -1 + 2 = 1 but 1>0 so this is 0
4 3 0 # same as previous row
5 -2 -2 # -2+0 = -2
6 -3 -3 # -2-3 = -5 but the lowest value in column A since last 0 is -3 so this is replaced by -3
7 1 -2 # 1-3 = -2
8 -1 -3 # -1-2 = -3
9 1 -2 # -3 + 1 = -2
10 -2 -3 # -2-2 = -4 but the lowest value in column A since last 0 is -3 so this is replaced by -3
11 1 -2 # -3 +1 = -2
12 2 0 # -2+2 = 0
13 -1 -1 # 0-1 = -1
14 -2 -2 # -1-2 = -3 but the lowest value in column A since last cap is -2 so this is -2 instead of -3
目前我做了这个,但不能 100% 工作,而且效率也不高:
df['B'] = 0
df['B'][0] = 0
for x in range(len(df)-1):
A = df['A'][x + 1]
B = df['B'][x] + A
if B >= 0:
df['B'][x+1] = 0
elif B < 0 and A < 0 and B < A:
df['B'][x+1] = A
else:
df['B'][x + 1] = B
【问题讨论】:
-
你如何从 B 列获取值?,我正在尝试使用
pd.Series([0, -1, 2, 3, -2, -3, 1, -1, 1, -2, 1, 2, -1, -2]).cumsum()并且它正在返回这个数组[0, -1, 1, 4, 2, -1, 0, -1, 0, -2, -1, 1, 0, -2]我可以使用这个累积总和并执行必要的操作来获取你的当前值B 列。但我不知道如何获得[Nan, -1, 0, 0, -2, -3, -2, -3, -2, -3, -2, 0, -1, -2] -
B 列是我需要的实际结果。 cumsum 无法到达 B 列,因为我需要在 cumsum 上应用条件才能获取 B 列。我将编辑我的问题,以便更清楚。
-
您可以使用
df['A'].expanding(1).apply(function)运行自己的function将得到:第一行,接下来的2行,接下来的3行等。这样我几乎可以得到结果,但仍然有问题检查自上次 0 以来的最低值。 -
我对最小值有疑问,如果我们连续替换它,或者我们只将它从之前分配的值中取到 B 例如
min = min or B [i-1] -
所以最小值是从 A 列获得的,并且每次 A 列给出较低的值时都会更新,然后在 B = 0 时重置。
标签: python pandas numpy cumsum