如何通过密钥访问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"