如何从另一个类别执行滚动总和
How to perform rolling sum from another category
我正在尝试执行一些计算以检索某个类别在两次出现的另一个类别之间的滚动总数。
我知道这不容易用语言来描述。
所以,这里是输入数据帧和预期输出的例子
输入:
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
我试过好几件事都没有成功。
你能帮我理解怎么做吗?
使用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
首先为 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
我正在尝试执行一些计算以检索某个类别在两次出现的另一个类别之间的滚动总数。
我知道这不容易用语言来描述。
所以,这里是输入数据帧和预期输出的例子
输入:
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
我试过好几件事都没有成功。
你能帮我理解怎么做吗?
使用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
首先为 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