根据先前值的值计算值

calculate value based on value from previous value

我给出了以下数据集,描述了在框架 (frameNo) 中购买商品的交易。该框架包含一分钟内发生的事件。因此,"currentGold" 值仅描述了玩家进入框架的金币价值。

我想做的是计算每次交易后还剩下多少黄金。按 frameNo 分组,因为玩家可以在事件之间产生金币(在这个例子中是在帧之间)。

           gameId platformId  frameNo  timestamp  itemId  currentGold    Cost
0       948881246        BR1      1.0       4451    2010          500      50
1       948881246        BR1      1.0       5129    1055          500     450
2       948881246        BR1      6.0     302762    1038         1300    1300
3       948881246        BR1      7.0     417640    1001          300     300
4       948881246        BR1      8.0     420211    1036          759     350
5       948881246        BR1      8.0     421285    1036          759     350
6       948881246        BR1      8.0     421904    2010          759      50
7       948881246        BR1     10.0     555882    3133         1220     310
8       948881246        BR1     10.0     557963    1018         1220     800
9       948881246        BR1     10.0     558777    2010         1220      50
10      948881246        BR1     12.0     697438    3508          850     200
11      948881246        BR1     12.0     701438    1051          850     400
12      948881246        BR1     12.0     701796    1042          850     300
13      948881246        BR1     12.0     703291    2010          850      50
14      948881246        BR1     15.0     848427    3086         1397     500
15      948881246        BR1     15.0     849077    3006         1397     500
16      948881246        BR1     15.0     851125    3363         1397       0

这是我想要达到的结果:

           gameId platformId  frameNo  timestamp  itemId  currentGold    Cost  availGold
0       948881246        BR1      1.0       4451    2010          500      50       500
1       948881246        BR1      1.0       5129    1055          500     450       450
2       948881246        BR1      6.0     302762    1038         1300    1300      1300
3       948881246        BR1      7.0     417640    1001          300     300       300
4       948881246        BR1      8.0     420211    1036          759     350       759
5       948881246        BR1      8.0     421285    1036          759     350       409
6       948881246        BR1      8.0     421904    2010          759      50        59
7       948881246        BR1     10.0     555882    3133         1220     310      1220
8       948881246        BR1     10.0     557963    1018         1220     800       910
9       948881246        BR1     10.0     558777    2010         1220      50       110
10      948881246        BR1     12.0     697438    3508          850     200       850
11      948881246        BR1     12.0     701438    1051          850     400       650
12      948881246        BR1     12.0     701796    1042          850     300       350
13      948881246        BR1     12.0     703291    2010          850      50        50   
14      948881246        BR1     15.0     848427    3086         1397     500      1397
15      948881246        BR1     15.0     849077    3006         1397     500       897
16      948881246        BR1     15.0     851125    3363         1397       0       397

我尝试通过 iterrows() 进行迭代,但是,我认为不可能到达之前的行,而且对 (gameId, platformId, frameNo) 键的依赖让我有点头疼

您的 "desired" 输出中的以下行是否有错误?

948881246        BR1     12.0     701438    1051          850     400       650
948881246        BR1     12.0     701796    1042          850     300       350
948881246        BR1     12.0     703291    2010          850      50        50

根据您描述的逻辑和前几行,这里的最后一列 (availGold) 应该是第二行的 250 和最后一行的 -50。如果是这种情况,您可以使用 cumsumshift:

来实现
df['frameCost'] = df.groupby(['gameId', 'platformId', 'frameNo'])['Cost'].cumsum()
df['availGold'] = df['currentGold'] - df.groupby(['gameId', 'platformId', 'frameNo'])['frameCost'].shift(1).fillna(0)