Cara mencetak objek groupby

134

Saya ingin mencetak hasil pengelompokan dengan Pandas.

Saya memiliki kerangka data:

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

Saat mencetak setelah pengelompokan menurut 'A', saya memiliki yang berikut:

print(df.groupby('A'))

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

Bagaimana cara mencetak dataframe yang dikelompokkan?

Jika aku melakukan:

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

Saya mendapatkan kerangka data seolah-olah tidak dikelompokkan:

             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

Saya mengharapkan sesuatu seperti:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
two   2    two  2
three 3  three  3
      4  three  4
pengguna3465658
sumber
Saya mendapatkan hasil yang benar dengan print df.groupby('A').head(). versi panda apa yang kamu punya?
Amit Verma
Saya baru saja memperbarui ke 0.13.1 di desktop dan laptop saya.
pengguna3465658
1
Bagaimana dengan "daftar ()" objek secara langsung? Dan kemudian Anda dapat memanipulasi / mencetaknya sebagai struktur data normal.
Tropicpenguin
Sejauh yang saya tahu, tidak ada satu jawaban pun yang berhasil menghasilkan keluaran yang diinginkan. Untuk contoh khusus ini, yang terdekat yang dapat saya temukan adalah df.groupby(['A', 'B']).sum(), tetapi akan gagal jika ('A', 'B')pasangan tidak unik.
Eric Duminil

Jawaban:

100

Cukup lakukan:

grouped_df = df.groupby('A')

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

Ini juga berhasil,

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

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

Untuk pengelompokan kunci selektif: Masukkan kunci yang Anda inginkan di dalam key_list_from_gb, dalam berikut, menggunakan gb.keys(): Misalnya,

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")
Surya
sumber
1
Pilihan lainnya adalah:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen
__iter __ () juga berfungsi. Ini mengembalikan Generator yang menghasilkan urutan (nama, objek subset) untuk setiap grup
Jeremy Z
Mengapa tidak mengulang key_list_from_gb?
pfnuesel
66

Jika Anda hanya mencari cara untuk menampilkannya, Anda dapat menggunakan deskripsikan ():

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

Ini memberi Anda tabel yang rapi.

Swagath
sumber
7
Ini adalah meja yang rapi tetapi itu bukan meja yang diinginkan.
Eric Duminil
15

Saya mengonfirmasi bahwa perilaku head()perubahan antara versi 0,12 dan 0,13. Itu terlihat seperti bug bagi saya. Saya membuat masalah .

Tapi operasi groupby tidak benar-benar mengembalikan DataFrame yang diurutkan berdasarkan grup. The .head()Metode ini sedikit menyesatkan di sini - itu hanya sebuah fitur kenyamanan untuk membiarkan Anda memeriksa kembali objek (dalam hal ini, df) yang dikelompokkan. Hasil dari groupbyadalah jenis objek yang terpisah, sebuah GroupByobjek. Anda harus apply, transformataufilter untuk kembali ke DataFrame atau Seri.

Jika yang ingin Anda lakukan hanyalah mengurutkan menurut nilai di kolom A, Anda harus menggunakan df.sort('A').

Dan Allan
sumber
4
Perhatikan yang headsebenarnya dilakukan head(5)sekarang ini menunjukkan 5 baris pertama, lebih tepat untuk 'menampilkan' bingkai df.groupby('A').apply(lambda x: x), yang secara efektif merupakan passthru. Saya kira Anda bisa memiliki pass()metode, mungkin.
Jeff
13

Alternatif sederhana lainnya:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)
Sumit Pokhrel
sumber
9

Selain itu, alternatif sederhana lainnya adalah:

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

Selain jawaban sebelumnya:

Mengambil contoh Anda,

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

Kemudian kode 1 baris sederhana

df.groupby('A').apply(print)
QPeiran
sumber
4

Terima kasih kepada Surya atas wawasan yang bagus. Saya akan membersihkan solusinya dan hanya melakukan:

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

Daftar panggilan () pada objek GroupBy

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

Memberi anda:

[('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)]
Elizabeth Orrico
sumber
Ya, ini membutuhkan lebih banyak suara! Anda juga dapat melakukan ini setelah mengelompokkan objek. df_g = df.groupby ('A') maka Anda dapat memanggil daftar (df_g) atau jika Anda hanya ingin daftar panggilan grup pertama (df_g) [0]. Ini adalah satu hal yang saya suka tentang R over Python. Di R Anda tidak perlu mengulang melalui sebagian besar objek untuk melihat datanya, tetapi Python Anda harus pada banyak objek. Menemukan proses seperti ini menyegarkan. Terima kasih Elizabeth.
PVic
2

Anda tidak dapat melihat data groupBy secara langsung dengan pernyataan cetak tetapi Anda dapat melihat dengan mengulangi grup menggunakan for loop coba kode ini untuk melihat grup berdasarkan data

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)

Anda akan mendapatkan output setelah mencoba ini sebagai hasil groupby

Saya harap ini membantu

praveen kumar
sumber
2

Di Jupyter Notebook, jika Anda melakukan hal berikut, ini akan mencetak versi objek yang dikelompokkan. The applyMetode membantu dalam penciptaan dataframe multiindex.

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

Keluaran:

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

Jika Anda ingin bykolom tidak muncul di output, cukup jatuhkan kolom, seperti itu.

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

Keluaran:

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

Di sini, saya tidak yakin mengapa .iloc[:]tidak berhasil, bukan [:]di akhir. Jadi, jika ada beberapa masalah di masa depan karena pembaruan (atau saat ini), .iloc[:len(a)]juga berfungsi.

Barnik Biswas
sumber
0

Saya menemukan cara yang janggal, sekedar untuk brainstorming, lihat kodenya:

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)

hasil:

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

Pro sangat mudah untuk mencetak, karena mengembalikan kerangka data, bukan Groupby Object. Dan hasilnya terlihat bagus. Sementara kononnya adalah membuat serangkaian data yang berlebihan.

Sheng Zhuang
sumber
0

Dalam python 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

Dengan cara yang lebih interaktif

Deepanshu Mehta
sumber
-2

untuk mencetak semua (atau banyak) baris dari df yang dikelompokkan:

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
randomWalk112358
sumber