如何通过密钥按数据分组访问熊猫

如何通过密钥访问groupby对象中的相应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

     A         B   C

1  bar -0.611756  18

3  bar -1.072969  10

5  bar -2.301539  18

key=foo

     A         B   C

0  foo  1.624345   5

2  foo -0.528172  11

4  foo  0.865408  14

我希望能够通过其键访问组:


In [12]: gb['foo']

Out[12]:  

     A         B   C

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]:

     A         B   C

0  foo  1.624345   5

2  foo -0.528172  11

4  foo  0.865408  14  

但是考虑到这些事情上熊猫通常很漂亮,这有点令人讨厌。

这样做的内置方式是什么?


Qyouu
浏览 389回答 3
3回答

温温酱

您可以使用以下get_group方法:In [21]: gb.get_group('foo')Out[21]:      A         B   C0  foo  1.624345   52  foo -0.528172  114  foo  0.865408  14注意:这不需要为每个组创建一个中间字典/每个子数据帧的副本,因此,与使用创建天真的字典相比,它的内存效率更高dict(iter(gb))。这是因为它使用了groupby对象中已经可用的数据结构。您可以使用groupby切片选择不同的列:In [22]: gb[["A", "B"]].get_group("foo")Out[22]:     A         B0  foo  1.6243452  foo -0.5281724  foo  0.865408In [23]: gb["C"].get_group("foo")Out[23]:0     52    114    14Name: C, dtype: int64

小怪兽爱吃肉

Python for Data Analysis中的Wes McKinney(熊猫的作者)提供了以下方法:groups = dict(list(gb))它返回一个字典,其键是您的组标签,其值是DataFrames,即groups['foo']将产生您想要的东西:     A         B   C0  foo  1.624345   52  foo -0.528172  114  foo  0.865408  14
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python