如何将 pandas groupby、apply 和 cumsum 组合成一个语句

问题描述 投票:0回答:2

我正在尝试结合 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 表达式吗?

python pandas group-by cumsum
2个回答
2
投票

您可以使用

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

0
投票

你可以像这样组合它们:

df['accum_product'] = df.groupby('event').apply(lambda x: (x['weight'] * 
x['score']).cumsum())
© www.soinside.com 2019 - 2024. All rights reserved.