2014-08-29 145 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