如何通过密钥访问pandas群组数据框

如何通过密钥访问groupby对象中相应的groupby数据框? 有以下几组:

rand = np.random.RandomState(1) df = pd.DataFrame({'A': ['foo', 'bar'] * 3, 'B': rand.randn(6), 'C': rand.randint(0, 20, 6)}) gb = df.groupby(['A']) 

我可以遍历它来获取密钥和组:

 In [11]: for k, gp in gb: print 'key=' + str(k) print gp key=bar ABC 1 bar -0.611756 18 3 bar -1.072969 10 5 bar -2.301539 18 key=foo ABC 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14 

我希望能够做到这样的事情

 In [12]: gb['foo'] Out[12]: ABC 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14 

但是,当我这样做(当然,我必须做的gb[('foo',)] ),我得到这个奇怪的pandas.core.groupby.DataFrameGroupBy事情似乎没有任何方法对应的DataFrame我想要。

我能想到的最好的是

 In [13]: def gb_df_key(gb, key, orig_df): ix = gb.indices[key] return orig_df.ix[ix] gb_df_key(gb, 'foo', df) Out[13]: ABC 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14 

但这是一种讨厌的方式,考虑到pandas通常在这些方面有多好。
这是什么内置的方式?

您可以使用get_group方法:

 In [21]: gb.get_group('foo') Out[21]: ABC 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14 

注意:这不需要为每个组创build每个子数据框的中间字典/副本,因此使用dict(iter(gb))创build天真字典会更有效率。 这是因为它使用了groupby对象中已有的数据结构。


您可以使用groupby切片select不同的列:

 In [22]: gb[["A", "B"]].get_group("foo") Out[22]: AB 0 foo 1.624345 2 foo -0.528172 4 foo 0.865408 In [23]: gb["C"].get_group("foo") Out[23]: 0 5 2 11 4 14 Name: C, dtype: int64 

用于数据分析的Python中的Wes McKinney(pandas的作者)提供了以下配方:

 groups = dict(list(gb)) 

它返回一个字典,其键是你的组标签,其值是DataFrames,即

 groups['foo'] 

会产生你正在寻找的东西:

  ABC 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14 

而不是

 gb.get_group('foo') 

我更喜欢使用gb.groups

 df.loc[gb.groups['foo']] 

因为这样你也可以select多个列。 例如:

 df.loc[gb.groups['foo'],('A','B')] 

我正在寻找一种方法来抽样GroupBy obj的几个成员 – 不得不解决发布的问题,以完成这项工作。

创buildgroupby对象

 grouped = df.groupdy('some_key') 

selectN个数据框,并抓住他们的指示

 sampled_df_i = random.sample(grouped.indicies,N) 

抓住小组

 df_list = map(lambda df_i: grouped.get_group(df_i),sampled_df_i) 

可选 – 将其全部重新转换为单个数据框对象

 sampled_df = pd.concat(df_list, axis=0, join='outer') 
 gb = df.groupby(['A']) gb_groups = grouped_df.groups 

如果您正在寻找有select性的groupby对象,那么请执行:gb_groups.keys(),然后将所需的关键字input到以下key_list中。

 gb_groups.keys() key_list = [key1, key2, key3 and so on...] for key, values in gb_groups.iteritems(): if key in key_list: print df.ix[values], "\n"