IT

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

itgroup 2023. 6. 7. 22:32
반응형

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

키에 의한 개체별 그룹의 데이터 프레임으로 해당 그룹에 액세스하려면 어떻게 해야 합니까?

다음 그룹 기준:

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내가 원하는 데이터 프레임에 해당하는 메소드가 없는 것처럼 보이는 객체.

제가 생각할 수 있는 최선의 방법은:

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  

하지만 판다들이 보통 이런 것들을 얼마나 잘하는지를 고려하면, 이것은 좀 고약합니다.
이것을 하는 기본적인 방법은 무엇입니까?

다음 방법을 사용할 수 있습니다.

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))개체별로 그룹에서 이미 사용할 수 있는 데이터 구조를 사용하기 때문입니다.


그룹을 사용하여 여러 열을 슬라이스하여 선택할 수 있습니다.

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

개체별로 선택적 그룹을 찾는 경우 gb_groups.keys()를 수행하고 다음 key_list에 원하는 키를 입력합니다.

gb_groups.keys()

key_list = [key1, key2, key3 and so on...]

for key, values in gb_groups.items():
    if key in key_list:
        print(df.ix[values], "\n")

GroupByobj의 멤버 몇 명을 샘플로 채취할 방법을 찾고 있었습니다. 이 작업을 수행하기 위해 게시된 질문을 해결해야 했습니다.

다음을 기준으로 개체별 그룹 생성some_key기둥.

grouped = df.groupby('some_key')

N개의 데이터 프레임을 선택하고 해당 인덱스를 가져옵니다.

sampled_df_i  = random.sample(grouped.indices, 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')
df.groupby('A').get_group('foo')

다음과 같습니다.

df[df['A'] == 'foo']

언급URL : https://stackoverflow.com/questions/14734533/how-to-access-pandas-groupby-dataframe-by-key

반응형