キーによって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',)]
を実行する必要があります)、必要なDataFrameに対応するメソッドがないように見えるこの奇妙な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
しかし、これは、Nice pandasが通常これらのことをどのように行うかを考えると、ちょっと厄介です。
これを行うための組み込みの方法は何ですか?
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オブジェクトで既に利用可能なデータ構造を使用しているためです。
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
データ分析のPythonのWes McKinney(パンダの著者)は、次のレシピを提供しています。
groups = dict(list(gb))
キーがグループラベルで、値がDataFramesである辞書を返します。
groups['foo']
あなたが探しているものが得られます:
A B C
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']]
この方法では、複数の列も選択できるためです。例えば:
df.loc[gb.groups['foo'],('A','B')]
gb = df.groupby(['A'])
gb_groups = grouped_df.groups
選択的なgroupbyオブジェクトを探している場合は、gb_groups.keys()を実行し、目的のキーを次の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"
GroupByオブジェクトのいくつかのメンバーをサンプリングする方法を探していました-これを行うには、投稿された質問に対処する必要がありました。
grouped = df.groupby('some_key')
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')