我如何按类别分组并按月计算总销售额 - pandas
How can I group by category and sum total sales by month - pandas
我有以下数据框:
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
我该怎么做?
感谢大家的帮助!
您可以使用 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
我更喜欢的方法是创建一个额外的列,然后在该列上进行分组。
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()
结果完全符合要求:
我有以下数据框:
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
我该怎么做?
感谢大家的帮助!
您可以使用 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
我更喜欢的方法是创建一个额外的列,然后在该列上进行分组。
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()
结果完全符合要求: