如果已经提出这个问题,请道歉。
我正在尝试为某个客户帐户中的所有订单点创建年度累计金额,并且正在努力。
基本上,我想创建`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)
也会产生错误。
帮助吗
答案 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此解决方案不依赖于记录的顺序......