Gruplandırılmış Pandalar veri çerçevesi üzerinde nasıl döngü yapılır?


146

Veri çerçevesi:

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

Kod:

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

Sadece toplanan veriler üzerinde döngü çalışıyorum, ama hatayı alıyorum:

ValueError: paketten çıkarılacak çok fazla değer

@EdChum, beklenen çıktı:

                                                    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           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

Çıktı sorun değil, ben her grup üzerinde döngü istiyorum.

Yanıtlar:


224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) zaten bir veri çerçevesi döndürdüğünden, artık gruplar üzerinde döngü yapamazsınız.

Genel olarak:

  • df.groupby(...)Bir döndüren GroupBybir nesne (a DataFrameGroupBy veya SeriesGroupBy) ve bu, sen yinelerler can (docs açıklandığı gibi grupları aracılığıyla burada ). Gibi bir şey yapabilirsiniz:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
    
  • Eğer örnekte GroupBy, üzerinde bir işlevi uyguladığınızda df.groupby(...).agg(...)(ancak bu da olabilir transform, apply, mean, ...), sen birleştirmek sonucunu uygulayarak birlikte bir dataframe farklı gruplara fonksiyonunu (uygulamak ve adımını birleştirmek groupby 'split-uygula-birleştir' paradigması). Böylece bunun sonucu her zaman yine bir DataFrame (veya uygulanan işleve bağlı bir Seri) olacaktır.


50

pd.DataFrameSütuna göre gruplandırılmış bir yinelemenin bir örneği atable. Örnek bir usecase için, bir SQL veritabanı için "create" deyimleri fordöngü içinde oluşturulur :

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(");")

8
Bir kişiyi groupkullanarak tekrar edebileceğinizi gösterdiğiniz için teşekkürler for row, data in group.iterrows()!
tatlar

16

Veri çerçeveniz önceden oluşturulmuşsa dizin değerleri üzerinde yineleme yapabilirsiniz.

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
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.