Как перебрать сгруппированные 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 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...
Выход не является проблемой, я хочу перебрать каждую группу.
Ответы
Ответ 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]