如何通过键访问 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 对应的方法。
gb[('foo',)]
pandas.core.groupby.DataFrameGroupBy
我能想到的最好的是:
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
但这有点讨厌,考虑到大熊猫通常在这些事情上有多好。 这样做的内置方法是什么?
您可以使用以下get_group方法:
get_group
In [21]: gb.get_group('foo') Out[21]: A B C 0 foo 1.624345 5 2 foo -0.528172 11 4 foo 0.865408 14
注意:这不需要为每个组创建中间字典/每个子数据帧的副本,因此比使用dict(iter(gb)). 这是因为它使用 groupby 对象中已有的数据结构。
dict(iter(gb))
您可以使用 groupby 切片选择不同的列:
In [22]: gb[["A", "B"]].get_group("foo") Out[22]: A B 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