2014-08-29 142 views
0

我有一個很大的數據框和一個小數據框,我想加入到一起。小數據框按組保存最大的每週值,該值對應於較大數據框中的值範圍。我想加入每個組每週最大值到大框架。多列加入羣熊貓

大框架:

L 
datetime  group value 
2014-05-07 A  3 
2014-05-07 B  3 
2014-05-14 A  4 
2014-05-14 B  2 
2014-05-15 A  6 
2014-05-15 B  4 
2014-05-16 A  7 
2014-05-16 B  10 

小框架:

S 
weeknumber group maxval 
1   A  3 
1   B  3 
2   A  7 
2   B  10 

注意,這些都是假設周值,實際值將對應於週數在這一年,出來的52

要計算小框架,我們可以在我們的日期時間設置一個索引:

import pandas as pd 
L.index = pd.to_datetime(L.datetime) 

我們可以通過團體和周組,像這樣:

week = L.groupby([(lambda x : x.week),'group'], as_index=False) 

計算每週最多是簡單的:

weekmax = week.value.max() 

這將返回小框架,是我卡住。我嘗試合併數據框並執行連接,但無法使其工作。

編輯: 這就是我想要的最後一幀看起來像加入後:

datetime  group value maxval 
2014-05-07 A  3  3 
2014-05-07 B  3  3 
2014-05-14 A  4  7 
2014-05-14 B  2  10 
2014-05-15 A  6  7 
2014-05-15 B  4  10 
2014-05-16 A  7  7 
2014-05-16 B  10  10 
+0

我可能沒有清楚地理解您的問題。看起來,加入後你留下了更小的框架。你可以通過使用'how ='left''或'how ='right''作爲連接參數來避免這種情況。默認情況下,連接使用'how ='inner'',只留下合併值的交集。 – 2014-08-29 17:07:01

+0

編輯顯示所需的輸出 – camdenl 2014-08-29 17:14:06

回答

2

你想用transform將返回聚集的像索引版本。因此,您可以直接指定回較大的框架,如下所示:

In [189]: L['maxval'] = week['value'].transform('max') 

In [190]: L 
Out[190]: 
       datetime group value maxval 
datetime         
2014-05-07 2014-05-07  A  3  3 
2014-05-07 2014-05-07  B  3  3 
2014-05-14 2014-05-14  A  4  7 
2014-05-14 2014-05-14  B  2  10 
2014-05-15 2014-05-15  A  6  7 
2014-05-15 2014-05-15  B  4  10 
2014-05-16 2014-05-16  A  7  7 
2014-05-16 2014-05-16  B  10  10 
+0

這給了我的真實數據集時的NaN,也許是因爲我的時間間隔包括hh:mm:ss? – camdenl 2014-08-29 17:56:26

+0

@camdenl - 這不應該是一個問題,你確定'L'和'week'引用相同的DataFrame?如果您仍然遇到問題,請張貼可複製粘貼的錯誤版本。 – chrisb 2014-08-29 17:58:57

+0

對不起,這是一個錯字,現在我得到了:'與幀索引插入列的不兼容索引' – camdenl 2014-08-29 18:07:45