2015-07-21 85 views
6

我与熊猫的GROUPBY功能试验,特别是从大熊猫选择多个组GROUPBY对象

gb = df.groupby('model') 
gb.hist() 

由于GB拥有50组的结果是相当混乱,我想只为探索结果前5个组。

我发现如何选择一个组,但使用groupsget_groupHow to access pandas groupby dataframe by key),但不知道如何直接选择多个组。 我能做的最好的是:

groups = dict(list(gb)) 
subgroup = pd.concat(groups.values()[:4]) 
subgroup.groupby('model').hist() 

有没有更直接的方法?

+0

选择前n组有点含糊,也许你的意思是**你如何将前n组加入单个数据框** ..沿着这些线?还有,你想如何选择组?随机或根据该群体的人口等? – dermen

+0

现在我只是按照它们的顺序来选择它们,有点像使用head()或者tail()来了解数据的外观。我认为我的方法已经加入了单个数据框中的第一组,但它也会更好,更高效的解决方案 – lib

+1

您可以通过调用'gp.groups'来获得组,请参阅:http://pandas.pydata.org /pandas-docs/stable/generated/pandas.core.groupby.GroupBy.groups.html#pandas.core.groupby.GroupBy.groups你可能最好先过滤你的df,这样'df_filt = df [df ['model '] .isin(df ['model']。unique()[:5])]'then'gb = df_filt.groupby('model')'#rest代码与以前相同 – EdChum

回答

4

你可以做这样的事情

new_gb = pandas.concat([ gb.get_group(group) for i,group in enumerate(gb.groups) if i < 5 ]).groupby('model')  
new_gb.hist() 

虽然,我会另一种方式讨论。您可以使用collections.Counter对象得到快速组:

import collections 

df = pandas.DataFrame.from_dict({'model': pandas.np.random.randint(0, 3, 10), 'param1': pandas.np.random.random(10), 'param2':pandas.np.random.random(10)}) 
# model param1 param2 
#0  2 0.252379 0.985290 
#1  1 0.059338 0.225166 
#2  0 0.187259 0.808899 
#3  2 0.773946 0.696001 
#4  1 0.680231 0.271874 
#5  2 0.054969 0.328743 
#6  0 0.734828 0.273234 
#7  0 0.776684 0.661741 
#8  2 0.098836 0.013047 
#9  1 0.228801 0.827378 
model_groups = collections.Counter(df.model) 
print(model_groups) #Counter({2: 4, 0: 3, 1: 3}) 

现在你可以在Counter的物体,像字典迭代,并查询您需要的群体:

new_df = pandas.concat([df.query('model==%d'%key) for key,val in model_groups.items() if val < 4 ]) # for example, but you can select the models however you like 
# model param1 param2 
#2  0 0.187259 0.808899 
#6  0 0.734828 0.273234 
#7  0 0.776684 0.661741 
#1  1 0.059338 0.225166 
#4  1 0.680231 0.271874 
#9  1 0.228801 0.827378 

现在你可以使用内置-in pandas.DataFrame.groupby功能

gb = new_df.groupby('model') 
gb.hist() 

由于model_groups包含了所有的团体,你可以从它作为你想挑。

如果您model列中包含的不是整数字符串值(名称或东西),它将所有的工作方式相同 - 只是改变了查询参数从'model==%d'%key'model=="%s"'%key

0

我不知道如何将.get_group() method与多个组一起使用。

但是,您可以iterate through groups

它仍然是一个有点难看,要做到这一点,但这里是一个解决方案与迭代:

limit = 5 
i = 0 
for key, group in gd: 
    print key, group 
    i += 1 
    if i >= limit: 
     break 

你也可以做一个.get_group()循环,恕我直言。有点漂亮,但仍然很难看。

for key in gd.groups.keys()[:2]: 
    print gd.get_group(key) 
+0

使用.get_group )方法与多个组,您需要传递一个Tuple值为key1和值为key2 ... – user2265478

3

这将会是容易只是先过滤您的DF,然后执行GROUPBY:

In [155]: 

df = pd.DataFrame({'model':np.random.randint(1,10,100), 'value':np.random.randn(100)}) 
first_five = df['model'].sort(inplace=False).unique()[:5] 
gp = df[df['model'].isin(first_five)].groupby('model') 
gp.first() 
Out[155]: 
      value 
model   
1  -0.505677 
2  1.217027 
3  -0.641583 
4  0.778104 
5  -1.037858