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