Làm thế nào để lặp qua khung dữ liệu Pandas được nhóm?


146

Khung dữ liệu:

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

Mã số:

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

Tôi đang cố gắng lặp lại dữ liệu tổng hợp, nhưng tôi gặp lỗi:

ValueError: quá nhiều giá trị để giải nén

@EdChum, đây là đầu ra dự kiến:

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

Đầu ra không phải là vấn đề, tôi muốn lặp qua mỗi nhóm.

Câu trả lời:


224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) đã trả về một khung dữ liệu, vì vậy bạn không thể lặp qua các nhóm nữa.

Nói chung:

  • df.groupby(...)trả về một GroupByđối tượng (một DataFramegroupBy hoặc SeriesgroupBy) và với điều này, bạn có thể lặp qua các nhóm (như được giải thích trong các tài liệu ở đây ). Bạn có thể làm một cái gì đó như:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
  • Khi bạn áp dụng một hàm trên groupby, trong ví dụ của bạn df.groupby(...).agg(...)(nhưng điều này cũng có thể là transform, apply, mean, ...), bạn kết hợp kết quả của việc áp dụng các chức năng để các nhóm khác nhau trong cùng một dataframe (các áp dụng và kết hợp bước của 'mô hình chia tách áp dụng kết hợp' của nhóm). Vì vậy, kết quả của việc này sẽ luôn là một DataFrame (hoặc Sê-ri tùy thuộc vào chức năng được áp dụng).


49

Dưới đây là một ví dụ về việc lặp qua một pd.DataFramenhóm theo cột atable. Đối với một usecase mẫu, các câu lệnh "tạo" cho cơ sở dữ liệu SQL được tạo trong forvòng lặp:

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
Cảm ơn bạn đã chứng minh rằng bạn có thể lặp qua một cá nhân groupbằng cách sử dụng for row, data in group.iterrows()!
tatlar

16

Bạn có thể lặp lại các giá trị chỉ mục nếu khung dữ liệu của bạn đã được tạo.

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.