【问题标题】:Calculating total monthly cumulative number of Order计算总月累计订单数
【发布时间】:2019-01-24 06:38:48
【问题描述】:

我需要找到总月累计订单数。我有 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并使用pandas读取excel 我试图将日期时间列拆分为年和月,然后进行分组,但没有得到正确的结果。

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)

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 感谢您的帮助。但它没有正确计算累计数。
    • @Erhan - 你为什么这么认为?无法正确处理真实数据?你能解释更多吗?
    • 对不起我的错误我已经更新了想要的结果。我在找累计数。
    • @Erhan - 好的,你能解释一下为什么2,3,4 吗?
    • 2011 - 11 有 2 个订单。 2011-12 只有 1 个,总共 3 个,2012-03 另一个,总共 4 个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多