当其他列中的值不为零时的累积和
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
我有一个包含多个列的巨大数据框,如下所示。我正在尝试查找 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