我正在尝试结合 groupby/cumsum 使用的产品表达式,因为产品的唯一目的是创造一个临时的持有价值。
data = {
'trial': pd.Series([1, 2, 3, 4, 5, 6, 7]),
'event': pd.Series(['A','A','A','B','B','B','C']),
'weight': pd.Series([1,2,4,5,5,3,1]),
'score': pd.Series([100,100,50,80,80,100,60])
}
df = pd.DataFrame(data)
df['tmp_product'] = df['weight'] * df['score'] # (1)
df['accum_product'] = df.groupby('event')['tmp_product'].cumsum() # (2)
del df['tmp_product']
print(df.head())
trial event weight score accum_product
0 1 A 1 100 100
1 2 A 2 100 300
2 3 A 4 50 500
3 4 B 5 80 400
4 5 B 5 80 800
上面的代码确实有效,但是当我尝试将 #1 和 #2 组合在一起时,它失败了(如下所示):
df['accum_product'] = df.groupby('event').apply(lambda x: x['weight'] * x['score'], axis=1).cumsum()
有什么解决方案可以结合上面的#1/#2 df 表达式吗?
mul
并将其与GroupBy.cumsum
链接:
df["accum_product"] = df["weight"].mul(df["score"]).groupby(df["event"]).cumsum()
或者按照@Chrysophylaxs的建议,使用
eval
:
df["accum_product"] = df.eval("weight * score").groupby(df["event"]).cumsum()
输出:
print(df)
trial event weight score accum_product
0 1 A 1 100 100
1 2 A 2 100 300
2 3 A 4 50 500
3 4 B 5 80 400
4 5 B 5 80 800
5 6 B 3 100 1100
6 7 C 1 60 60
你可以像这样组合它们:
df['accum_product'] = df.groupby('event').apply(lambda x: (x['weight'] *
x['score']).cumsum())