累计金额(熊猫)

时间:2016-11-09 19:10:18

标签: python pandas

如果已经提出这个问题,请道歉。

我正在尝试为某个客户帐户中的所有订单点创建年度累计金额,并且正在努力。

基本上,我想创建`YearlyTotal'下面:

Customer   Year   Date       Order   PointsPerOrder   YearlyTotal
123456     2016   11/2/16    A939    1                 20
123456     2016   3/13/16    A102    19                19
789089     2016   7/15/16    A123    7                 7

我试过了:

df['YEARLYTOTAL'] = df.groupby(by=['Customer','Year'])['PointsPerOrder'].cumsum()

但是这会以错误的顺序生成YearlyTotal(即YearlyTotal A939为1而不是20。

不确定这是否重要,但Customer是一个字符串(数据库有前导零 - 不要让我开始)。前面的sort_values(by=['Customer','Year','Date'],ascending=True)也会产生错误。

帮助吗

2 个答案:

答案 0 :(得分:2)

使用[::-1]来反转数据帧:

df['YEARLYTOTAL'] = df[::-1].groupby(by=['Customer','Year'])['PointsPerOrder'].cumsum()

print (df)
   Customer  Year     Date Order  PointsPerOrder  YearlyTotal  YEARLYTOTAL
0    123456  2016  11/2/16  A939               1           20           20
1    123456  2016  3/13/16  A102              19           19           19
2    789089  2016  7/15/16  A123               7            7            7

答案 1 :(得分:1)

首先确保Date列为datetime列:

In [35]: df.Date = pd.to_datetime(df.Date)

现在我们可以做到:

In [36]: df['YearlyTotal'] = df.sort_values('Date').groupby(['Customer','Year'])['PointsPerOrder'].cumsum()

In [37]: df
Out[37]:
   Customer  Year       Date Order  PointsPerOrder  YearlyTotal
0    123456  2016 2016-11-02  A939               1           20
1    123456  2016 2016-03-13  A102              19           19
2    789089  2016 2016-07-15  A123               7            7

PS此解决方案不依赖于记录的顺序......