2016-11-26 65 views
3

我有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很容易,但如何用熊貓做到這一點?

+0

如何聚集發生?你能用一個例子來證明嗎? –

+1

如果使用SQL很容易,爲什麼不發佈你的SQL,我們可以嘗試將它翻譯成熊貓語法? – blacksite

回答

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 
+0

嘿!這個res ['date'] = res ['date']。str [:7] - 是個騙子) – mystdeim

+0

那種。那麼你可以很容易地調整這段代碼來處理'datetime',我認爲字符串只會縮短代碼,這不是重點:) –

+0

類似'res.date = res.date.dt.year * 1000 + res.date.dt.month'會做的伎倆:) –

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']]