繁体   English   中英

从 Pandas groupby 对象中选择多个组

[英]Select multiple groups from pandas groupby object

我正在试验熊猫的 groupby 功能,特别是

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

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

我找到了如何使用groupsget_group选择单个组(如何通过键访问熊猫 groupby 数据get_group ),但没有找到如何直接选择多个组。 我能做的最好的是:

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

有没有更直接的方法?

首先过滤 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

你可以做类似的事情

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

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

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

由于model_groups包含所有组,您可以根据需要从中选择。

笔记

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

我不知道有什么方法可以将.get_group()方法用于多个组。

但是,您可以遍历组

这样做仍然有点难看,但这是一个迭代的解决方案:

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)
gbidx=list(gb.indices.keys())[:4]
dfidx=np.sort(np.concatenate([gb.indices[x] for x in gbidx]))
df.loc[dfidx].groupby('model').hist()

gb.indices 比 gb.groups 或 list(gb) 快

我相信 concat Index 比 concat DataFrames 快

我已经尝试过我的 ~416M 行 13 列(包括 str)和 720MB 大小的大 csv 文件,并且通过多个列进行分组

然后将 col 名称更改为问题中的名称

def get_groups(group_object):
    for i in group_object.groups.keys():
        print(f"____{i}____")
        display(group_object.get_group(i))


#get all groups by calling this method 

get_groups( any_group_which_you_made )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM