จะวนลูปมากกว่าดาต้าดาต้าของ Pandas ที่จัดกลุ่มได้อย่างไร


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

รหัส:

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

ฉันพยายามที่จะวนรอบข้อมูลรวม แต่ฉันได้รับข้อผิดพลาด:

ValueError: มีค่าที่จะแกะออกมากเกินไป

@EdChum นี่คือผลลัพธ์ที่คาดหวัง:

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

ผลลัพธ์ไม่ใช่ปัญหาฉันต้องการวนซ้ำทุกกลุ่ม

คำตอบ:


224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) ส่งคืน dataframe แล้วคุณจึงไม่สามารถวนซ้ำกลุ่มได้อีก

โดยทั่วไป:

  • df.groupby(...)ส่งคืนGroupByวัตถุ (a DataFrameGroupBy หรือ SeriesGroupBy) และด้วยสิ่งนี้คุณสามารถทำซ้ำผ่านกลุ่ม (ตามที่อธิบายไว้ในเอกสารที่นี่ ) คุณสามารถทำสิ่งที่ชอบ:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
    
  • เมื่อคุณใช้ฟังก์ชั่นในการ GroupBy ในตัวอย่างของคุณdf.groupby(...).agg(...)( แต่นี้ยังสามารถtransform, apply, mean... ), คุณรวมผลมาจากการใช้ฟังก์ชั่นให้กับกลุ่มที่แตกต่างกันในหนึ่ง dataframe (นำไปใช้และรวมขั้นตอนของ กระบวนทัศน์ 'แบ่งใช้รวม' ของ groupby) ดังนั้นผลลัพธ์ของสิ่งนี้จะเป็น DataFrame อีกครั้ง (หรือ Series ขึ้นอยู่กับฟังก์ชันที่ใช้)


50

นี่คือตัวอย่างของการทำซ้ำมากกว่าจัดกลุ่มตามคอลัมน์pd.DataFrame atableสำหรับตัวอย่าง usecase คำสั่ง "create" สำหรับฐานข้อมูล SQL จะถูกสร้างขึ้นภายในforลูป:

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
ขอบคุณที่แสดงให้เห็นว่าคุณสามารถทำซ้ำผ่านการgroupใช้งานของแต่ละบุคคลfor row, data in group.iterrows()!
tatlar

16

คุณสามารถวนซ้ำค่าดัชนีหากสร้างฐานข้อมูลของคุณแล้ว

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.