Python Pandas 日期和说明总和

Python Pandas Sum on Date and Description

我正在使用 Python 2.7。我有一个 Pandas 数据框,看起来像

raw_data = {'Date': ['12/1/2016', '12/4/2016','12/23/2016', '1/18/2017','1/18/2017','1/19/2017'], 
    'Account': ['aa1', 'aa2','aa1', 'aa1', 'aa1', 'aa2'], 
    'Description': ['store1', 'store2','store1', 'store2','store1','store2' ], 
    'Amount': [26.43, 24.99, 31.54,45.32, 2.00, 15.41],
    'Category': ['G','G','G','G','G','G'],
    'Initials': ['FR','DB','FR','DB','FR','FR']}
df = pd.DataFrame(raw_data, columns = ['Date','Account','Description','Amount','Category','Initials'])

我想按每个描述和月份进行汇总,以便我的数据如下所示:
日期 说明 金额
2016 年 12 月商店 1 57.97
2016 年 12 月商店 2 24.99
2017 年 1 月商店 1 2.00
2017 年 1 月商店 2 60.73

我已经编写了以下按月求和的代码,但我对如何合并描述列感到困惑。

#convert Date to datetimeindex
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')

#sum by month
df = df.groupby(pd.TimeGrouper("M")).sum()
df

任何指导将不胜感激。谢谢

使用 strftimedatetime 转换为使用 Year 格式化 name of month 并将列 Description 添加到 groupby:

df = df.groupby([df['Date'].dt.strftime('%b %Y'),'Description']).sum().reset_index()
print (df)
       Date Description  Amount
0  Dec 2016      store1   57.97
1  Dec 2016      store2   24.99
2  Jan 2017      store1    2.00
3  Jan 2017      store2   60.73

如果需要 Datetimes 则仅添加另一列 Description:

df = df.set_index('Date')

df = df.groupby([pd.TimeGrouper("M"),'Description']).sum().reset_index()
print (df)
        Date Description  Amount
0 2016-12-31      store1   57.97
1 2016-12-31      store2   24.99
2 2017-01-31      store1    2.00
3 2017-01-31      store2   60.73

要删除较新版本 pandas 中的警告,请使用 Grouper:

df = df.groupby([pd.Grouper(freq="M"),'Description']).sum().reset_index()
print (df)
        Date Description  Amount
0 2016-12-31      store1   57.97
1 2016-12-31      store2   24.99
2 2017-01-31      store1    2.00
3 2017-01-31      store2   60.73

您可以 groupby dt.monthDescription。使用 dt.strftime 并将月份编号转换为月份名称,然后 然后 执行分组:

df.groupby([df.Date.dt.strftime('%b %Y'),
       'Description']).Amount.sum().reset_index()

       Date Description  Amount
0  Dec 2016      store1   57.97
1  Dec 2016      store2   24.99
2  Jan 2017      store1    2.00
3  Jan 2017      store2   60.73