熊猫累积在标志概念

时间:2017-11-04 13:47:50

标签: python pandas

我有一个数据帧列,它有很多值,有些+ 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

正如您所看到的那样,符号方向会发生变化,这会导致累积更改作为重置概念

2 个答案:

答案 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