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


154

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

그러나 팬더가 보통 이런 것들에 얼마나 좋은지 고려하면 이것은 불쾌합니다.
이 작업을 수행하는 기본 제공 방법은 무엇입니까?

답변:


192

다음 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

72

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

1
고맙습니다. 매우 유용합니다. groups = dict(list(gb))상점 열만 만들도록 코드를 어떻게 수정 C합니까? 다른 열에 관심이 없으므로 저장하고 싶지 않다고 가정 해 봅시다.
Zhubarb

5
답변 :dict(list( df.groupby(['A'])['C'] ))
Zhubarb

4
참고 :을 사용하는 것이 더 효율적이지만 동등합니다 dict(iter(g)). (하지만 get_group사전을 만들지 않고 팬더를 유지하는 가장 좋은 방법 이지만 )
Andy Hayden

groups (dict (list (gb))를 사용할 수 없었지만 다음과 같은 방법으로 사전을 만들 수 있습니다. 다음을 gb_dict = {str(indx): str(val) for indx in gb.indx for val in gb.some_key}통해 값을 검색하십시오.gb_dict[some_key]
user2476665

그냥 사용은 get_group(),이 조리법은 년에 필요한되지 않았습니다.
smci

20

오히려

gb.get_group('foo')

나는 사용하는 것을 선호합니다 gb.groups

df.loc[gb.groups['foo']]

이 방법으로 여러 열을 선택할 수도 있기 때문입니다. 예를 들면 다음과 같습니다.

df.loc[gb.groups['foo'],('A','B')]

4
참고 :을 사용하여 다른 열을 선택할 수 있습니다 gb[["A", "B"]].get_group("foo").
Andy Hayden

6
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"

1

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

1
이 작동하지 않습니다 :sampled_df_i = random.sample(grouped.indicies, N)
이레네

@irene-더 긴 예제 / 더 많은 컨텍스트에 대한 링크를 제공 할 수 있습니까?
meyerson

다음과 같은 오류가 발생합니다.AttributeError: 'DataFrameGroupBy' object has no attribute 'indicies'
irene
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.