【问题标题】:How can I group by category and sum total sales by month - pandas如何按类别分组并按月汇总总销售额 - 熊猫
【发布时间】:2021-04-25 18:53:14
【问题描述】:

我有以下数据框:

test = {'Date': ['2021-01-01', '2021-01-15', '2021-01-02', '2021-01-14', '2021-01-05', '2021-01-07'],
        'Category': ['Fixed', 'Fixed', 'Mindful Spending', 'Mindful Spending', 'Subscription', 'Subscription'],
       'Amount': ['5', '5', '5', '5', '5', '5']}
example = pd.DataFrame(test)
example

我的Date 列数据类型是datetime64[ns],使用pd.to_datetime 转换。我想按Category 分组,并计算Date 月的总支出。我想要的结果是这样的:

test = {'Date': ['2021-01', '2021-01', '2021-01'], 
        'Category': ['Fixed', 'Mindful Spending', 'Subscription'],
       'Amount': ['10', '10', '10']}
result = pd.DataFrame(test)
result

我该怎么做?

感谢大家的帮助!

【问题讨论】:

    标签: python pandas pandas-groupby python-datetime


    【解决方案1】:

    我更喜欢解决这个问题的方法是创建一个额外的列,然后您可以在该列上进行分组。

    import pandas as pd
    test = {'Date': ['2021-01-01', '2021-01-15', '2021-01-02', '2021-01-14', '2021-01-05', '2021-01-07'],
        'Category': ['Fixed', 'Fixed', 'Mindful Spending', 'Mindful Spending', 'Subscription', 'Subscription'],
       'Amount': [5, 5, 5, 5, 5, 5]}
    example = pd.DataFrame(test)
    
    # convert to datetime column
    example['Date'] = pd.to_datetime(example['Date']) 
    
    # Extract formatted string on which to groupby
    example['date_month'] = example['Date'].dt.strftime('%Y-%m')
    
    example.groupby(['date_month', 'Category'], as_index=False)['Amount'].sum()
    

    结果完全符合要求:

    【讨论】:

      【解决方案2】:

      您可以使用pd.Grouper 定义要分组的月份。请注意,为此目的,日期列必须是您的索引。

      test = {'Date': ['2021-01-01', '2021-01-15', '2021-01-02', '2021-01-14', '2021-01-05', '2021-01-07'],
              'Category': ['Fixed', 'Fixed', 'Mindful Spending', 'Mindful Spending', 'Subscription', 'Subscription'],
             'Amount': [5, 5, 5, 5, 5, 5]}
      example = pd.DataFrame(test)
      example.Date = pd.DatetimeIndex(example.Date)
      
      example.set_index("Date").groupby([pd.Grouper(freq="M"), "Category"]).sum().reset_index()
      
      
      Out[2]: 
              Date          Category  Amount
      0 2021-01-31             Fixed      10
      1 2021-01-31  Mindful Spending      10
      2 2021-01-31      Subscription      10
      

      【讨论】: