[python] 키로 팬더 그룹별로 데이터 프레임에 액세스하는 방법

키별로 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

그러나 내가 그렇게하려고하면 원하는 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방법을 사용할 수 있습니다 .

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 객체에서 이미 사용 가능한 데이터 구조를 사용하기 때문입니다.


그룹화를 사용하여 다른 열을 선택할 수 있습니다.

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 for Data Analysis의 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를 다음 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 obj의 일부 멤버를 샘플링하는 방법을 찾고있었습니다.이 작업을 수행하려면 게시 된 질문을 해결해야했습니다.

그룹 별 객체 생성

grouped = df.groupby('some_key')

N 개의 데이터 프레임을 선택하고 지수를 가져옵니다.

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')


답변