Подтвердить что ты не робот

Как перебрать сгруппированные Pandas данные?

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

Выход не является проблемой, я хочу перебрать каждую группу.

4b9b3361

Ответ 1

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,...), вы объединяете результат применения функции для разных групп вместе в одном фрейме данных (шаг применения и объединения парадигмы split-apply-comb of groupby). Таким образом, результатом этого всегда будет снова DataFrame (или серия в зависимости от применяемой функции).

Ответ 2

Ниже приведен пример того, как выполнять итерацию по группам столбцов таблицы для генерации операторов "создания" из фрейма, описывающего базу данных:

example

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

g1 = df1.groupby('atable')

for table, group in g1:
    print('\nCREATE TABLE {}('.format(table))

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

    print(");")

Ответ 3

Вы можете перебирать значения индекса, если ваш фреймворк уже создан.

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