2015-07-21 167 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