groupby 개체를 인쇄하는 방법


133

Pandas로 그룹화 한 결과를 인쇄하고 싶습니다.

데이터 프레임이 있습니다.

import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
print(df)

       A  B
0    one  0
1    one  1
2    two  2
3  three  3
4  three  4
5    one  5

'A'로 그룹화 한 후 인쇄 할 때 다음이 있습니다.

print(df.groupby('A'))

<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>

그룹화 된 데이터 프레임을 어떻게 인쇄 할 수 있습니까?

만약 내가한다면:

print(df.groupby('A').head())

그룹화되지 않은 것처럼 데이터 프레임을 얻습니다.

             A  B
A                
one   0    one  0
      1    one  1
two   2    two  2
three 3  three  3
      4  three  4
one   5    one  5

나는 다음과 같은 것을 기대하고 있었다.

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
two   2    two  2
three 3  three  3
      4  three  4

올바른 출력을 얻고 print df.groupby('A').head()있습니다. 어떤 버전의 팬더가 있습니까?
Amit Verma 2014 년

데스크톱과 노트북 모두에서 방금 0.13.1로 업데이트했습니다.
user3465658

1
객체를 직접 "list ()"하는 것은 어떻습니까? 그런 다음 일반 데이터 구조로 조작 / 인쇄 할 수 있습니다.
Tropicpenguin

내가 말할 수있는 한, 하나의 대답이 원하는 출력을 생성하지 못합니다. 이 특정 예에서 내가 찾을 수있는 가장 가까운 것은 df.groupby(['A', 'B']).sum()이지만 ('A', 'B')쌍이 고유 하지 않으면 실패합니다 .
에릭 Duminil

답변:


100

간단하게 :

grouped_df = df.groupby('A')

for key, item in grouped_df:
    print(grouped_df.get_group(key), "\n\n")

이것도 작동합니다.

grouped_df = df.groupby('A')    
gb = grouped_df.groups

for key, values in gb.iteritems():
    print(df.ix[values], "\n\n")

선택적 키 그룹화의 경우 :key_list_from_gb 다음을 사용하여, 안에 원하는 키를 삽입합니다 gb.keys(). 예를 들어,

gb = grouped_df.groups
gb.keys()

key_list_from_gb = [key1, key2, key3]

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

1
다른 옵션은 다음과 같습니다.for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen

__iter __ ()도 작동합니다. 각 그룹에 대해 (이름, 하위 집합 개체)의 시퀀스를 생성하는 Generator를 반환합니다.
Jeremy Z

key_list_from_gb그래도 반복하지 않는 이유는 무엇 입니까?
pfnuesel

66

단순히 표시하는 방법을 찾고 있다면 describe ()를 사용할 수 있습니다.

grp = df.groupby['colName']
grp.describe()

이것은 당신에게 깔끔한 테이블을 제공합니다.


6
깔끔한 테이블이지만 원하는 테이블이 아닙니다.
Eric Duminil 19

15

head()버전 0.12와 0.13 사이 의 변경 동작을 확인했습니다 . 저에게는 버그처럼 보입니다. 문제를 만들었습니다 .

그러나 groupby 작업은 실제로 그룹별로 정렬 된 DataFrame을 반환하지 않습니다. 이 .head()방법은 여기서 약간 오해의 소지가 있습니다 df. 그룹화 한 객체 (이 경우 )를 다시 검사 할 수있는 편리한 기능 입니다. 의 결과 groupby는 별도의 개체 인 GroupBy개체입니다. 당신이해야합니다 apply, transform또는filter DataFrame 또는 시리즈로 다시 얻을 수 있습니다.

A 열의 값을 기준으로 정렬하려는 경우를 사용해야합니다 df.sort('A').


4
head실제로 수행하고 있다는 점에 유의 head(5)하십시오. 처음 5 행을 표시하고 있으며 '표시'프레임이 더 정확합니다 df.groupby('A').apply(lambda x: x). 이는 사실상 통과입니다. pass()아마도 당신이 방법을 가질 수 있다고 생각합니다 .
Jeff

13

또 다른 간단한 대안 :

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)

9

또한 다른 간단한 대안은 다음과 같습니다.

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)

7

이전 답변 외에도 :

예를 들어,

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})

그런 다음 간단한 한 줄 코드

df.groupby('A').apply(print)

4

좋은 통찰력을 주신 Surya에게 감사드립니다. 나는 그의 솔루션을 정리하고 단순히 다음을 수행합니다.

for key, value in df.groupby('A'):
    print(key, value)

3

GroupBy 개체에 대한 list () 호출

print(list(df.groupby('A')))

제공합니다 :

[('one',      A  B
0  one  0
1  one  1
5  one  5), ('three',        A  B
3  three  3
4  three  4), ('two',      A  B
2  two  2)]

예, 더 많은 표가 필요합니다! 개체를 그룹화 한 후에도이 작업을 수행 할 수 있습니다. df_g = df.groupby ( 'A') 그러면 list (df_g)를 호출하거나 첫 번째 그룹 호출 list (df_g) [0] 만 원할 경우 호출 할 수 있습니다. 이것은 내가 파이썬보다 R에 대해 좋아하는 한 가지입니다. R에서는 데이터를보기 위해 대부분의 객체를 반복 할 필요가 없지만 Python은 많은 객체를 처리해야합니다. 이와 같은 프로세스를 찾는 것은 신선합니다. 고마워 엘리자베스.
PVic

2

print 문으로 groupBy 데이터를 직접 볼 수는 없지만 for 루프를 사용하여 그룹을 반복하여 볼 수 있습니다.이 코드를 사용하여 데이터별로 그룹을 확인하십시오.

group = df.groupby('A') #group variable contains groupby data
for A,A_df in group: # A is your column and A_df is group of one kind at a time
  print(A)
  print(A_df)

groupby 결과로 이것을 시도한 후 출력을 얻을 수 있습니다.

도움이 되길 바랍니다


2

Jupyter Notebook에서 다음을 수행하면 개체의 멋진 그룹 버전이 인쇄됩니다. 이 apply방법은 다중 인덱스 데이터 프레임을 만드는 데 도움이됩니다.

by = 'A'  # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])

산출:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
three 3  three  3
      4  three  4
two   2    two  2

당신이 원하는 경우 by열 (들) 너무처럼, 열 (들)을 삭제, 출력에 나타나지 않을 수 있습니다.

df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])

산출:

         B
A         
one   0  0
      1  1
      5  5
three 3  3
      4  4
two   2  2

여기서 이유가 확실하지 않습니다. .iloc[:][:] 끝 이 아니라 작동하지 . 따라서 향후 업데이트 (또는 현재)로 인해 몇 가지 문제가 발생하면 .iloc[:len(a)]작동합니다.


0

브레인 스토밍을 위해 까다로운 방법을 찾았습니다. 코드를 참조하세요.

df['a'] = df['A']  # create a shadow column for MultiIndexing
df.sort_values('A', inplace=True)
df.set_index(["A","a"], inplace=True)
print(df)

출력 :

             B
A     a
one   one    0
      one    1
      one    5
three three  3
      three  4
two   two    2

전문가는 Groupby Object 대신 데이터 프레임을 반환하므로 인쇄가 매우 쉽습니다. 그리고 출력이 멋져 보입니다. 단점은 일련의 중복 데이터를 생성한다는 것입니다.


0

파이썬 3에서

k = None
for name_of_the_group, group in dict(df_group):
    if(k != name_of_the_group):
        print ('\n', name_of_the_group)
        print('..........','\n')
    print (group)
    k = name_of_the_group

더 상호 작용 방식으로


-2

그룹화 된 df의 모든 (또는 임의로 많은) 행을 인쇄하려면 :

import pandas as pd
pd.set_option('display.max_rows', 500)

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.