如何按月汇总和汇总项目?
我有2个dataframes(订单和项目与价格):如何按月汇总和汇总项目?
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很容易,但如何用熊猫做到这一点?
你想每个订单采取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
嘿!这个res ['date'] = res ['date']。str [:7] - 是个骗子) – mystdeim
那种。那么你可以很容易地调整这段代码来处理'datetime',我认为字符串只会缩短代码,这不是重点:) –
类似'res.date = res.date.dt.year * 1000 + res.date.dt.month'会做的伎俩:) –
我这样做,它的工作原理:
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']]
如何聚集发生?你能用一个例子来证明吗? –
如果使用SQL很容易,为什么不发布你的SQL,我们可以尝试将它翻译成熊猫语法? – blacksite