pandas中某列为0时如何重置每组累计和
How to reset cumulative sum per group when a certain column is 0 in pandas
我有以下数据框,我想在其中对特定列 (Value
) 以及字段 Group
上的分组进行累加和,但将该累加和重置为 0当另一列 (Quantity
) 中的值为 0 时。
Group
Quantity
Value
Cumulative_sum
A
10
200
200
B
5
300
300
A
1
50
250
A
0
100
0
C
5
400
400
A
10
300
300
B
10
200
500
A
15
350
650
我试过像下面的代码一样使用块,但问题是它没有正确计算累计和:
blocks = df['Quantity'].eq(0)[::-1].cumsum()[::-1]
df['temp_field'] = (df.groupby(['Group', blocks])
['Value'].cumsum()
.where(df['Quantity']!=0,df['Value'])
)
df['Cumulative_sum'] = np.where(df['Quantity'] == 0, 0, df['temp_field'])
有人可以帮忙吗?
对于给定的重置 condition
,使用 groupby.cumsum
创建一个 Reset
石斑鱼,告诉我们何时 Quantity
在每个 Group
:
condition = df.Quantity.eq(0)
df['Reset'] = condition.groupby(df.Group).cumsum()
# Group Quantity Value Cumulative_sum Reset
# 0 A 10 200 200 0
# 1 B 5 300 300 0
# 2 A 1 50 250 0
# 3 A 0 100 0 1
# 4 C 5 400 400 0
# 5 A 10 300 300 1
# 6 B 10 200 500 0
# 7 A 15 350 650 1
mask
每当满足重置 condition
时 Value
列并使用另一个 groupby.cumsum
Group
和 Reset
:
df['Cumul'] = df.Value.mask(condition, 0).groupby([df.Group, df.Reset]).cumsum()
# Group Quantity Value Cumulative_sum Reset Cumul
# 0 A 10 200 200 0 200
# 1 B 5 300 300 0 300
# 2 A 1 50 250 0 250
# 3 A 0 100 0 1 0
# 4 C 5 400 400 0 400
# 5 A 10 300 300 1 300
# 6 B 10 200 500 0 500
# 7 A 15 350 650 1 650
我有以下数据框,我想在其中对特定列 (Value
) 以及字段 Group
上的分组进行累加和,但将该累加和重置为 0当另一列 (Quantity
) 中的值为 0 时。
Group | Quantity | Value | Cumulative_sum |
---|---|---|---|
A | 10 | 200 | 200 |
B | 5 | 300 | 300 |
A | 1 | 50 | 250 |
A | 0 | 100 | 0 |
C | 5 | 400 | 400 |
A | 10 | 300 | 300 |
B | 10 | 200 | 500 |
A | 15 | 350 | 650 |
我试过像下面的代码一样使用块,但问题是它没有正确计算累计和:
blocks = df['Quantity'].eq(0)[::-1].cumsum()[::-1]
df['temp_field'] = (df.groupby(['Group', blocks])
['Value'].cumsum()
.where(df['Quantity']!=0,df['Value'])
)
df['Cumulative_sum'] = np.where(df['Quantity'] == 0, 0, df['temp_field'])
有人可以帮忙吗?
对于给定的重置
condition
,使用groupby.cumsum
创建一个Reset
石斑鱼,告诉我们何时Quantity
在每个Group
:condition = df.Quantity.eq(0) df['Reset'] = condition.groupby(df.Group).cumsum() # Group Quantity Value Cumulative_sum Reset # 0 A 10 200 200 0 # 1 B 5 300 300 0 # 2 A 1 50 250 0 # 3 A 0 100 0 1 # 4 C 5 400 400 0 # 5 A 10 300 300 1 # 6 B 10 200 500 0 # 7 A 15 350 650 1
mask
每当满足重置condition
时Value
列并使用另一个groupby.cumsum
Group
和Reset
:df['Cumul'] = df.Value.mask(condition, 0).groupby([df.Group, df.Reset]).cumsum() # Group Quantity Value Cumulative_sum Reset Cumul # 0 A 10 200 200 0 200 # 1 B 5 300 300 0 300 # 2 A 1 50 250 0 250 # 3 A 0 100 0 1 0 # 4 C 5 400 400 0 400 # 5 A 10 300 300 1 300 # 6 B 10 200 500 0 500 # 7 A 15 350 650 1 650