根据先前值的值计算值

时间:2018-03-09 19:38:06

标签: python-3.x pandas pandas-groupby running-total

我有以下数据集,描述了在框架中购买商品的交易(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)键的依赖性给了我一些头痛

1 个答案:

答案 0 :(得分:1)

您可能在以下行的“所需”输出中出现错误吗?

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)