你可以做这样的事情
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