如何将pandas groupby、apply和cumsum和合并到一个语句中

hs1ihplo  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(127)

我尝试合并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表达式?

67up9zun

67up9zun1#

您可以使用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

相关问题