【问题标题】:Python Pandas Sum on Date and DescriptionPython Pandas 总和日期和描述
【发布时间】:2017-11-19 21:17:32
【问题描述】:

我正在使用 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 月 store1 57.97
2016 年 12 月 store2 24.99
2017 年 1 月 store1 2.00
2017 年 1 月 store2 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

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

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    你可以groupbydt.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
    

    【讨论】:

      【解决方案2】:

      使用strftimedatetimes 转换为name of monthYear 的格式并将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
      

      【讨论】:

        猜你喜欢
        • 2015-11-07
        • 2019-06-28
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        相关资源
        最近更新 更多