如何从另一个类别执行滚动求和

我正在尝试执行一些计算来检索另一个类别的两次出现之间的类别的滚动总数。

我意识到用语言来描述并不容易。

因此,这是输入数据帧和预期输出的示例


输入:


Date       Category  Value

2012-01-04        A     10

2012-01-06        A     20

2012-02-15        B    -10

2012-04-29        A      5

2012-04-30        A     70

2012-10-15        A     15

2012-10-16        B    -30

2012-11-19        B    -50

预期输出:仅 B 行,但提及自上次出现 B 以来 A 的滚动总数


Date       Category  Value  Total_A_since_previous_B

2012-02-15        B    -10                        30

2012-10-16        B    -30                        90

2012-11-19        B    -50                         0

我已经尝试了几件事但没有成功。

你能帮我理解怎么做吗?


料青山看我应如是
浏览 102回答 2
2回答

红糖糍粑

首先为 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_B2   2012-02-15  B           -10     306   2012-10-16  B           -30     907   2012-11-19  B           -50     0

HUH函数

使用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_B0  2012-02-15        B    -10                        301  2012-10-16        B    -30                        902  2012-11-19        B    -50                         0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python