Bagaimana cara mengulang dataframe Pandas yang dikelompokkan?

146

DataFrame:

  c_os_family_ss c_os_major_is l_customer_id_i
0      Windows 7                         90418
1      Windows 7                         90418
2      Windows 7                         90418

Kode:

print df
for name, group in df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)):
    print name
    print group

Saya mencoba untuk hanya mengulang data agregat, tetapi saya mendapatkan kesalahan:

ValueError: terlalu banyak nilai untuk dibongkar

@ Edum, inilah output yang diharapkan:

                                                    c_os_family_ss  \
l_customer_id_i
131572           Windows 7,Windows 7,Windows 7,Windows 7,Window...
135467           Windows 7,Windows 7,Windows 7,Windows 7,Window...

                                                     c_os_major_is
l_customer_id_i
131572           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...
135467           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

Outputnya bukan masalah, saya ingin mengulang setiap grup.

Tjorriemorrie
sumber

Jawaban:

224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) sudah mengembalikan kerangka data, jadi Anda tidak dapat mengulangi grup lagi.

Secara umum:

  • df.groupby(...)mengembalikan GroupByobjek (DataFrameGroupBy atau SeriesGroupBy), dan dengan ini, Anda dapat mengulangi melalui grup (seperti yang dijelaskan dalam dokumen di sini ). Anda dapat melakukan sesuatu seperti:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
  • Bila Anda menerapkan fungsi pada groupby, dalam contoh df.groupby(...).agg(...)(tapi ini juga bisa transform, apply, mean, ...), Anda menggabungkan hasil dari penerapan fungsi untuk kelompok-kelompok yang berbeda bersama-sama dalam satu dataframe (yang berlaku dan menggabungkan langkah dari paradigma 'split-apply-menggabungkan' groupby). Jadi hasil dari ini akan selalu menjadi DataFrame (atau Seri tergantung pada fungsi yang diterapkan).

Joris
sumber
50

Berikut adalah contoh iterasi di atas pd.DataFramedikelompokkan berdasarkan kolom atable. Untuk contoh usecase, pernyataan "buat" untuk database SQL dihasilkan dalam forloop:

import pandas as pd

df1 = pd.DataFrame({
    'atable':     ['Users', 'Users', 'Domains', 'Domains', 'Locks'],
    'column':     ['col_1', 'col_2', 'col_a', 'col_b', 'col'],
    'column_type':['varchar', 'varchar', 'int', 'varchar', 'varchar'],
    'is_null':    ['No', 'No', 'Yes', 'No', 'Yes'],
})

df1_grouped = df1.groupby('atable')

# iterate over each group
for group_name, df_group in df1_grouped:
    print('\nCREATE TABLE {}('.format(group_name))

    for row_index, row in df_group.iterrows():
        col = row['column']
        column_type = row['column_type']
        is_null = 'NOT NULL' if row['is_null'] == 'NO' else ''
        print('\t{} {} {},'.format(col, column_type, is_null))

    print(");")
Andrei Sura
sumber
8
Terima kasih telah menunjukkan bahwa Anda dapat beralih melalui seseorang groupmenggunakan for row, data in group.iterrows()!
tatlar
16

Anda dapat mengulangi nilai indeks jika kerangka data Anda telah dibuat.

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
khiner
sumber