根据先前值的值计算值
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
。如果是这种情况,您可以使用 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)
我给出了以下数据集,描述了在框架 (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
。如果是这种情况,您可以使用 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)