2 回答

TA貢獻1815條經驗 獲得超6個贊
首先為 B 的每次出現創建組,對值求和,然后將其作為新列分配給過濾后的 df。
(
pd.Series(np.where(df.Category.eq('B'), df.index, np.nan)).bfill()
.pipe(lambda x: df.groupby(x).Value.apply(lambda x: x[:-1].sum()))
.pipe(lambda x: df[df.Category=='B'].assign(Total_A_since_previous_B=x))
)
Date Category Value Total_A_since_previous_B
2 2012-02-15 B -10 30
6 2012-10-16 B -30 90
7 2012-11-19 B -50 0

TA貢獻1836條經驗 獲得超4個贊
使用GroupBy.agg:
blocks = df.Category.shift().eq('B').cumsum()
new_df = (df.groupby(blocks)
.agg(Date= ('Date','last'),
Category = ('Category','last'),
Value = ('Value','last'),
Total_A_since_previous_B = ('Value','sum')
)
.assign(Total_A_since_previous_B = lambda x: x.Total_A_since_previous_B
.sub(x.Value))
.reset_index(drop=True))
print(new_df)
Date Category Value Total_A_since_previous_B
0 2012-02-15 B -10 30
1 2012-10-16 B -30 90
2 2012-11-19 B -50 0
添加回答
舉報