从pandas groupby对象中选择多个组

lib*_*lib 11 python pandas

我正在尝试大熊猫的群体特征,特别是

gb = df.groupby('model')
gb.hist()
Run Code Online (Sandbox Code Playgroud)

由于gb有50个组,结果很混乱,我想只探索前5组的结果.

我找到了如何选择单个组groupsget_group(如何按键访问pandas groupby dataframe),而不是如何直接选择多个组.我能做的最好的事情是:

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

有更直接的方式吗?

EdC*_*ica 7

首先过滤你的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
Run Code Online (Sandbox Code Playgroud)


der*_*men 7

你可以做点什么

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

虽然,我会采用不同的方法.您可以使用该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})
Run Code Online (Sandbox Code Playgroud)

现在,您可以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
Run Code Online (Sandbox Code Playgroud)

现在您可以使用内置pandas.DataFrame.groupby函数

gb = new_df.groupby('model')
gb.hist() 
Run Code Online (Sandbox Code Playgroud)

由于model_groups包含所有组,您可以根据需要选择它.

注意

如果您的model列包含字符串值(名称或其他内容)而不是整数,则它们都将工作相同 - 只需将查询参数更改'model==%d'%key'model=="%s"'%key.