当其他列中的值不为零时的累积和

Cumulative sum when value in other column is non-zero

我有一个包含多个列的巨大数据框,如下所示。我正在尝试查找 b 中的值为 -1 且前面为 1 时的时间累计总和。我尝试了累计总和,但它不起作用。

仅当 b 中的值对于该组单独为 -1 时,我才查找值的累积和。一旦 b 中的值更改为 0,我希望累积总和重置为 0

我的累计总和值应与 cummulative_sum_column

中的值匹配
**date time**    **id**  **value**  **time**           **a****b**   **cummulative sum**
11/1/2021 0:05   v01111     4           0               0     0
11/1/2021 1:30   v01111     11      57.302              1     1 
11/1/2021 4:19   v01111     1       10129.88            0    -1 
11/1/2021 4:19   v01111     1       0.49                0    -1        10130.37
11/1/2021 9:30   v01111     2       0.202               0     0 
11/1/2021 9:31   v01111     11      58.699              1     1 
11/1/2021 10:31  v01111     1       3573.728            0    -1 
11/1/2021 10:31  v01111     1       0.29                0    -1       3574.018
11/2/2021 21:15  v01111     2       0.2                 0     0 
12/9/2021 20:17  v01112     11      58.525              1    0  
12/9/2021 20:53  v01113     11      2145.745            0    -1 
12/9/2021 20:53  v01114     1       0.016               0    -1           2146
12/9/2021 22:05  v01150     0       0.01                0    0  
12/9/2021 22:05  v01151     0       1.188               0    0  
12/9/2021 22:05  v01152     1       0.312               0   0   
12/9/2021 22:05  v01153     1       1.49                0   -1  
12/9/2021 22:09  v01153     1       4                   1   0   
12/10/2021 22:07 v01153     1       6                   0   -1            6

我在下面尝试过,但是当 b 中的值 == -1 时,代码会计算所有值的累积和,一旦 b 中的值为 0,它就不会重置为 0

df['test']= df.loc[(df['b'] == -1) & (df['b'].shift(+1) == 1), 'time'].cumsum()

你可以这样试试:

for i, row in df.iterrows():
    if row["b"] == -1 and i != len(df) - 1:
        cumsum += row["time"]
    if i != 0 and row["b"] == 0:
        df.loc[i - 1, "cumsum"] = cumsum
        cumsum = 0
    if row["b"] == -1 and i == len(df) - 1:
        cumsum += row["time"]
        df.loc[i, "cumsum"] = cumsum

这样:

print(df.fillna(0))
# Outputs
          date       time      id  value  a  b     cumsum
0    11/1/2021      0.000  v01111      4  0  0      0.000
1    11/1/2021     57.302  v01111     11  1  1      0.000
2    11/1/2021  10129.880  v01111      1  0 -1      0.000
3    11/1/2021      0.490  v01111      1  0 -1  10130.370
4    11/1/2021      0.202  v01111      2  0  0      0.000
5    11/1/2021     58.699  v01111     11  1  1      0.000
6    11/1/2021   3573.728  v01111      1  0 -1      0.000
7    11/1/2021      0.290  v01111      1  0 -1   3574.018
8    11/2/2021      0.200  v01111      2  0  0      0.000
9    12/9/2021     58.525  v01112     11  1  0      0.000
10   12/9/2021   2145.745  v01113     11  0 -1      0.000
11   12/9/2021      0.016  v01114      1  0 -1   2145.761
12   12/9/2021      0.010  v01150      0  0  0      0.000
13   12/9/2021      1.188  v01151      0  0  0      0.000
14   12/9/2021      0.312  v01152      1  0  0      0.000
15   12/9/2021      1.490  v01153      1  0 -1      1.490
16   12/9/2021      4.000  v01153      1  1  0      0.000
17  12/10/2021      6.000  v01153      1  0 -1      6.000

我们按 'b' 中相同值的运行分组,并将总和应用于组;然后我们将 'b' 不是 -1 的总和归零。 'cumsum' 显示 'b'==-1 组中每一行的各个组的总和

grouper = (df['b'] != df['b'].shift()).cumsum()
df['cumsum'] = df.groupby(grouper, group_keys = False)['time'].transform(sum)
df.loc[df['b'] != -1,'cumsum'] = 0
df

输出

         time    a    b    cumsum
--  ---------  ---  ---  --------
 0      0        0    0      0
 1     57.302    1    1      0
 2  10129.9      0   -1  10130.4
 3      0.49     0   -1  10130.4
 4      0.202    0    0      0
 5     58.699    1    1      0
 6   3573.73     0   -1   3574.02
 7      0.29     0   -1   3574.02
 8      0.2      0    0      0
 9     58.525    1    0      0
10   2145.74     0   -1   2145.76
11      0.016    0   -1   2145.76
12      0.01     0    0      0
13      1.188    0    0      0
14      0.312    0    0      0
15      1.49     0   -1      1.49
16      4        1    0      0
17      6        0   -1      6