你可以做這樣的事情
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
。
選擇前n組有點含糊,也許你的意思是**你如何將前n組加入單個數據框** ..沿着這些線?還有,你想如何選擇組?隨機或根據該羣體的人口等? – dermen
現在我只是按照它們的順序來選擇它們,有點像使用head()或者tail()來了解數據的外觀。我認爲我的方法已經加入了單個數據框中的第一組,但它也會更好,更高效的解決方案 – lib
您可以通過調用'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