Groupby nesnesi nasıl yazdırılır


134

Pandalar ile gruplamanın sonucunu yazdırmak istiyorum.

Bir veri çerçevem ​​var:

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' ile gruplandırdıktan sonra yazdırırken aşağıdakilere sahibim:

print(df.groupby('A'))

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

Dataframe'i gruplanmış olarak nasıl yazdırabilirim?

Eğer yaparsam:

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

Veri çerçevesini gruplanmamış gibi elde ediyorum:

             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

Şöyle bir şey bekliyordum:

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

İle doğru çıktı alıyorum print df.groupby('A').head(). Pandaların hangi versiyonuna sahipsiniz?
Amit Verma

Hem masaüstü hem de dizüstü bilgisayarımda 0.13.1'e yeni güncelledim.
user3465658

1
Nesneyi doğrudan "listelemeye ()" ne dersiniz? Ve sonra onu normal bir veri yapısı olarak işleyebilir / yazdırabilirsiniz.
Tropicpenguin

Anladığım kadarıyla tek bir cevap bile istenen çıktıyı üretemiyor. Bu özel örnek için, bulabildiğim en yakın şeydi df.groupby(['A', 'B']).sum(), ancak ('A', 'B')çiftler benzersiz değilse başarısız olur .
Eric Duminil

Yanıtlar:


100

Yapmanız gereken sadece:

grouped_df = df.groupby('A')

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

Bu da işe yarar,

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

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

Seçmeli anahtar gruplaması için:key_list_from_gb Aşağıdakileri kullanarak içine istediğiniz tuşları ekleyin gb.keys(): Örneğin,

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
Diğer bir seçenek ise:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen

__iter __ () de çalışır. Her grup için Generator ürün dizisini (adı, alt kümelenmiş nesne) döndürür
Jeremy Z

key_list_from_gbYine de neden döngü yapmıyorsunuz ?
pfnuesel

66

Eğer sadece onu göstermenin bir yolunu arıyorsanız, define () kullanabilirsiniz:

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

Bu size düzgün bir masa verir.


7
Düzgün bir masa ama istenen masa değil.
Eric Duminil

15

head()0.12 ve 0.13 sürümleri arasındaki davranışların değiştiğini doğruladım . Bu bana bir böcek gibi görünüyor. Bir sorun yarattım .

Ancak bir groupby işlemi aslında gruba göre sıralanmış bir DataFrame döndürmez. .head()Yöntem burada yanıltıcı biraz - bu (bu durumda nesneyi yeniden inceleyelim için sadece bir kolaylık özellik dfsize gruplandırılmış olduğu). Sonuç groupby, ayrı tür bir nesnedir, bir GroupBynesnedir. Sen gerekir apply, transformya filterbir DataFrame veya Series geri almak için.

Tek yapmak istediğiniz, A sütunundaki değerlere göre sıralamaksa, kullanmalısınız df.sort('A').


4
notu headaslında yapıyor head(5)bunun iow 'şov' çerçevedir, daha doğru ilk 5 satır gösteriyor df.groupby('A').apply(lambda x: x)etkili Geçiş olan. Sanırım bir pass()yöntemin olabilir , belki.
Jeff

13

Başka bir basit alternatif:

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

9

Ayrıca, diğer basit alternatifler şunlar olabilir:

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

7

Önceki cevaplara ek olarak:

Örneğin,

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

Sonra basit 1 satırlı kod

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

4

İyi bilgiler için Surya'ya teşekkürler. Çözümünü temizler ve basitçe yapardım:

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

3

GroupBy nesnesindeki çağrı listesi ()

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

sana verir:

[('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)]

Evet, bunun daha fazla oya ihtiyacı var! Bunu nesneyi grupladıktan sonra da yapabilirsiniz. df_g = df.groupby ('A') o zaman listeyi (df_g) çağırabilir veya sadece ilk grup arama listesini (df_g) [0] isteyebilirsiniz. Bu Python yerine R ile ilgili sevdiğim bir şey. R'de, verileri görmek için çoğu nesneyi yinelemeniz gerekmez, ancak Python, nesnenin çoğu üzerinde yapmanız gerekir. Bunun gibi süreçleri bulmak canlandırıcı. Teşekkürler Elizabeth.
PVic

2

groupBy verilerini doğrudan print deyimiyle göremezsiniz, ancak for döngüsünü kullanarak grup üzerinde yineleyerek görebilirsiniz, grubu verilere göre görmek için bu kodu deneyin

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)

bunu bir grup sonucu olarak denedikten sonra bir çıktı alacaksınız

Umut ediyorum bu yardım eder


2

Jupyter Notebook'da, aşağıdakileri yaparsanız, nesnenin güzel bir gruplanmış versiyonunu yazdırır. applyYöntem multiindex dataframe yaratılmasına yardımcı olur.

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

Çıktı:

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

bySütun (lar) ın çıktıda görünmemesini istiyorsanız , sadece sütunları bırakın.

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

Çıktı:

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

Burada neden sonunda .iloc[:]yerine çalışmadığından emin değilim [:]. Bu nedenle, gelecekte güncellemelerden (veya şu anda) kaynaklanan bazı sorunlar varsa .iloc[:len(a)]da işe yarar .


0

Sadece beyin fırtınası için zor bir yol buldum, koda bakın:

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)

çıktı:

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

Groupby Object yerine bir veri çerçevesi döndürdüğü için profesyonellerin yazdırması çok kolaydır. Ve çıktı güzel görünüyor. Eksi, bir dizi gereksiz veri oluşturmasıdır.


0

Python 3'te

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

Daha etkileşimli bir şekilde


0

df.groupby ('gruplamak istediğiniz tuş'). uygula (yazdır)

Başka bir üye tarafından belirtildiği gibi, bu, bir groupby nesnesini görselleştirmek için en kolay ve en basit çözümdür.


1
Hoşgeldin Karthik, bu QPeiran'ın yanıtıyla aynı mı?
RichieV

-2

gruplanmış df'nin tüm (veya keyfi olarak birçok) satırını yazdırmak için:

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.