2013-08-01 2 views
18

Я использую .size() для результата groupby, чтобы подсчитать количество элементов в каждой группе.Как назначить имя столбцу size()?

Я хочу, чтобы результат был сохранен для нового имени столбца без ручного редактирования массива имен столбцов, как это можно сделать?

Благодаря

Это то, что я пытался:

grpd = df.groupby(['A','B']) 
grpd['size'] = grpd.size() 
grpd 

и ошибок я получил:

TypeError: 'DataFrameGroupBy' object does not support item assignment (on the second line)

+1

Стоит отметить, что '' size'' является плохим выбором для столбца, так как это встроенный метод для каждого объекта под пандами, поэтому вы можете его извлекать только через '' getitem'', а не через '' getattr'' , – Meitham

ответ

12

Результат df.groupby(...) не является DataFrame. Чтобы вернуть DataFrame, вам необходимо применить функцию к каждой группе, преобразовать каждый элемент группы или фильтровать группы.

Похоже, вы хотите, чтобы DataFrame содержал (1) все ваши исходные данные в df и (2) количество данных в каждой группе. Эти вещи имеют разную длину, поэтому, если им нужно зайти в один и тот же DataFrame, вам нужно будет указать размер избыточно, т. Е. Для каждой строки в каждой группе.

df['size'] = df.groupby(['A','B']).transform(np.size) 

(За исключением: Это полезно, если вы можете показать краткий ввод образца и ожидаемые результаты.)

+1

yay, transform! –

+0

Я также нашел это почти равным (создает новый dataframe), но не уверен, как он сравнивается с вашим решением с точки зрения эффективности http://stackoverflow.com/questions/10373660/converting-a-pandas-groupby-object -to-dataframe – d1337

+0

Подробнее о вашем решении хорошо работает на примере игрушек, но по фактическим данным возвращается ошибка http://pastebin.com/aCsMxCd5 – d1337

6

Вам нужно transformsize - len из df такое же, как и раньше:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df['size'] = df.groupby(['A', 'B'])['A'].transform('size') 
print (df) 
    A B size 
0 x a  1 
1 x c  2 
2 x c  2 
3 y b  2 
4 y b  2 

Если потребность имя столбца в агрегировании df - lendf, очевидно, NOT такой же a s перед:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df = df.groupby(['A', 'B']).size().reset_index(name='Size') 
print (df) 
    A B Size 
0 x a  1 
1 x c  2 
2 y b  2 
12

.size() встроенный метод DataFrameGroupBy объектов фактически возвращает объект серии с размерами группы и не DataFrame. Если вы хотите, чтобы DataFrame, чей столбец был размером группы, индексированный группами, с настраиваемым именем, вы можете использовать метод .to_frame() и использовать в качестве аргумента имя нужного столбца.

grpd = df.groupby(['A','B']).size().to_frame('size') 

Если вы хотите группы быть столбцы снова можно добавить .reset_index() в конце.

Смежные вопросы