计算每月总累积订单数

时间:2019-01-24 06:38:49

标签: python pandas

我需要找到每月的累计订单总数。我有2列OrderDate和OrderId。由于数据太大,我无法使用列表来查找累积数字。并且结果应为year_month格式,以及每个月的累计订单总数。

orderDate                OrderId
2011-11-18 06:41:16      23
2011-11-18 04:41:16      2
2011-12-18 06:41:16      69
2012-03-12 07:32:15      235
2012-03-12 08:32:15      234
2012-03-12 09:32:15      235
2012-05-12 07:32:15      233

desired Result

Date                     CumulativeOrder
2011-11                  2
2011-12                  3
2012-03                  6
2012-05                  7

我已将我的excel导入pycharm并使用熊猫来读取excel 我试图将datetime列拆分为年和月,然后进行分组,但未获得正确的结果。

df1 = df1[['OrderId','orderDate']]
df1['year']  = pd.DatetimeIndex(df1['orderDate']).year
df1['month'] = pd.DatetimeIndex(df1['orderDate']).month
df1.groupby(['year','month']).sum().groupby('year','month').cumsum()
print (df1)

1 个答案:

答案 0 :(得分:1)

将列转换为日期时间,然后按to_period转换为月周期,按numpy.arange添加新列,最后根据列DateDataFrame.drop_duplicates删除重复项,并保留最后一个重复项:

import numpy as np

df1['orderDate'] = pd.to_datetime(df1['orderDate'])
df1['Date'] = df1['orderDate'].dt.to_period('m')
#use if not sorted datetimes
#df1 = df1.sort_values('Date')
df1['CumulativeOrder'] = np.arange(1, len(df1) + 1)
print (df1)
            orderDate  OrderId    Date  CumulativeOrder
0 2011-11-18 06:41:16       23 2011-11                1
1 2011-11-18 04:41:16        2 2011-11                2
2 2011-12-18 06:41:16       69 2011-12                3
3 2012-03-12 07:32:15      235 2012-03                4

df2 = df1.drop_duplicates('Date', keep='last')[['Date','CumulativeOrder']]
print (df2)
     Date  CumulativeOrder
1 2011-11                2
2 2011-12                3
3 2012-03                4

另一种解决方案:

df2 = (df1.groupby(df1['orderDate'].dt.to_period('m')).size()
          .cumsum()
          .rename_axis('Date')
          .reset_index(name='CumulativeOrder'))
print (df2)
     Date  CumulativeOrder
0 2011-11                2
1 2011-12                3
2 2012-03                6
3 2012-05                7