如何按类别分组并按月汇总总销售额 - pandas

时间:2021-04-25 18:53:14

标签: python pandas pandas-groupby python-datetime

我有以下数据帧:

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

enter image description here

我的 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

enter image description here

我该怎么做?

谢谢大家的帮助!

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

我更喜欢的处理方式是创建一个额外的列,然后在其上进行分组。

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()

结果完全符合要求: enter image description here