Python 3.x 基于上一个值的值计算值

Python 3.x 基于上一个值的值计算值,python-3.x,pandas,pandas-groupby,cumulative-sum,Python 3.x,Pandas,Pandas Groupby,Cumulative Sum,我给出了以下数据集,描述了在框架(frameNo)中购买项目的事务。该框架包含在一分钟内发生的事件。因此,“currentGold”(当前黄金)值仅表示玩家进入画面时的黄金价值 我想做的是计算每笔交易后剩下多少黄金。按帧号分组,因为玩家可以在事件之间(在本例中是在帧之间)生成黄金 这是我想要达到的结果: gameId platformId frameNo timestamp itemId currentGold Cost availGold 0

我给出了以下数据集,描述了在框架(frameNo)中购买项目的事务。该框架包含在一分钟内发生的事件。因此,“currentGold”(当前黄金)值仅表示玩家进入画面时的黄金价值

我想做的是计算每笔交易后剩下多少黄金。按帧号分组,因为玩家可以在事件之间(在本例中是在帧之间)生成黄金

这是我想要达到的结果:

           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)键的依赖性让我有点头疼

是否可能在以下行中的“所需”输出中有错误

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
。如果是这种情况,可以通过使用
cumsum
shift
来实现:

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