如何按月汇总和汇总项目?

时间:2016-11-26 17:39:48

标签: python pandas dataframe

我有2个数据框(订单和带价格的商品):

orders = pd.DataFrame({'id': [1,2], 'sum_delivery': [10, 0], 'date': ['2016-01-01', '2016-01-05']})
items = pd.DataFrame({'id': [1,2,3], 'order_id': [1,1,2], 'price': [100, 100, 500], 'count':[5,5,1]})

我希望按月汇总数据并最终得到这个数据框:

{'date': ['2016-01'], 'sum': [1510]}

sql可以很容易,但是如何用pandas做到这一点?

2 个答案:

答案 0 :(得分:3)

您希望每个订单仅考虑sum_delivery一次,因此您必须在加入之前groupby

>>> items2 = items.groupby('order_id', as_index=False)['sum'].sum()
>>> items2
   order_id   sum
0         1  1000
1         2   500

现在您可以使用pandas.DataFrame.merge来使用自定义列名称:

>>> res = pd.merge(orders, items2, left_on = 'id', right_on = 'order_id')[['date', 'sum', 'sum_delivery']]
>>> res
         date   sum  sum_delivery
0  2016-01-01  1000            10
1  2016-01-05   500             0

现在只做简单的数学和简单pandas.DataFrame.groupby(不要忘记使用as_index=False):

>>> res['date'] = res['date'].str[:7]
>>> res['sum2'] = res['sum'] + res['sum_delivery']
>>> res2 = res.groupby('date', as_index=False)['sum2'].sum()
>>> res2
      date  sum2
0  2016-01  1510

答案 1 :(得分:0)

我做了这个并且有效:

items2 = items.groupby('order_id', as_index=False)['sum'].sum()
res = pd.merge(orders, items2, left_on = 'id', right_on = 'order_id')[['date', 'sum', 'sum_delivery']]

res['sum2'] = res['sum'] + res['sum_delivery']
res.index = pd.to_datetime(res.date)
tmpdf = res.groupby(pd.TimeGrouper("M")).sum()[['sum2']]