我有一个数据帧列,它有很多值,有些+ ve和有些-ve
V
-1
-4
-3
-2
+1
+2
+1
+5
-3
-1
+1
+4
-5
-2
-4
+4
+6
我想创建另一个列,它具有累积的
如果当前位置值与前一个位置值不同,那么当前位置的累计值是当前值+前一个值
如果当前位置值与前一个位置值相同,那么当前位置的累计是先前位置的累积+当前值
值为V且累积为累积,如图所示
V Cumulative
-1 -1
-4 -5
-3 -8
-2 -10
+1 -1
+2 +1
+1 +2
+5 +7
-3 +2
-1 +1
+1 +0
+4 +4
-5 -1
-2 -3
-4 -7
+4 +0
+6 +6
正如您所看到的那样,符号方向会发生变化,这会导致累积更改作为重置概念
答案 0 :(得分:3)
好问题:-),我打破了步骤
# restore the value change(positive to negative) in and assign the group number , in the group you will only see all positive or negative.
df['g']=df.gt(0).diff().ne(0).cumsum()
# find the last value of the group
DF=df.groupby('g').last()
# shift the value to the next group , cause you need to carry save the value change
DF.index=DF.index+1
# combine the previous
df.groupby('g').V.cumsum()+df.g.map(DF.V).fillna(0)
Out[407]:
0 -1.0
1 -5.0
2 -8.0
3 -10.0
4 -1.0
5 1.0
6 2.0
7 7.0
8 2.0
9 1.0
10 0.0
11 4.0
12 -1.0
13 -3.0
14 -7.0
15 0.0
16 6.0
dtype: float64
分配新列
后df['cumlative']=df.groupby('g').V.cumsum()+df.g.map(DF.V).fillna(0)
df
Out[409]:
V g cumlative
0 -1 1 -1.0
1 -4 1 -5.0
2 -3 1 -8.0
3 -2 1 -10.0
4 1 2 -1.0
5 2 2 1.0
6 1 2 2.0
7 5 2 7.0
8 -3 3 2.0
9 -1 3 1.0
10 1 4 0.0
11 4 4 4.0
12 -5 5 -1.0
13 -2 5 -3.0
14 -4 5 -7.0
15 4 6 0.0
16 6 6 6.0
答案 1 :(得分:1)
第1步。定义变量和辅助函数
sum_p = 0 # sum previous
value_p = 0 # value previous
sign_p = "-"
def sign(x):
return("+" if x>0 else "-")
df = pd.DataFrame({"V": df.V, "Cumulative":0}, columns = ["V","Cumulative"])
第2步。计算累积
for i in df.iterrows():
if sign(i[1][0]) == sign_p:
df.iloc[i[0],1] = sum_p + i[1][0]
else:
df.iloc[i[0],1] = value_p + i[1][0]
sum_p = i[1][1]
value_p = i[1][0]
sign_p = sign(i[1][0])
df
V Cumulative
0 -1 -1
1 -4 -5
2 -3 -8
3 -2 -10
4 1 -1
5 2 1
6 1 2
7 5 7
8 -3 2
9 -1 1
10 1 0
11 4 4
12 -5 -1
13 -2 -3
14 -4 -7
15 4 0
16 6 6