Як перевести циклічний згрупований фрейм даних 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)) вже повертає кадр даних, тому ви більше не можете перебирати групи.

В загальному:

  • df.groupby(...)повертає GroupByоб’єкт (DataFrameGroupBy або SeriesGroupBy), і за допомогою цього ви можете переглядати групи (як пояснено в документах тут ). Ви можете зробити щось на кшталт:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
  • При застосуванні функції на GroupBy, в вашому прикладі df.groupby(...).agg(...)(але це також може бути transform, apply, mean, ...), ви скомбінувати результат застосування функції до різних груп в одному dataframe (Застосувати і об'єднати крок з парадигма "розділити-застосувати-поєднати" групи). Тому результатом цього завжди буде знову DataFrame (або серія залежно від застосованої функції).


50

Ось приклад ітерації над pd.DataFrameзгрупованою колоною atable. Для зразкового шаблону операції "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()!
татлар

16

Ви можете повторити значення індексу, якщо ваш фрейм даних вже створений.

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.