Как назначить имя столбцу size()?

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

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

Спасибо

Вот что я попробовал:

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

и ошибка, которую я получил:

TypeError: объект DataFrameGroupBy не поддерживает назначение элементов (во второй строке)

5 ответов

Решение

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

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

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

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

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

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

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

Тебе нужно 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 - 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 = 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

Вы можете установить as_index параметр в groupby к False чтобы получить DataFrame вместо Series:

      df = pd.DataFrame({'A': ['a', 'a', 'b', 'b'], 'B': [1, 2, 2, 2]})

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

Выход:

         A  B  size
0  a  1     1
1  a  2     1
2  b  2     2

Допустим, n - это имя dataframe, а cst - это количество повторяющихся элементов. Ниже код дает счет в следующем столбце

cstn=Counter(n.cst)
cstlist = pd.DataFrame.from_dict(cstn, orient='index').reset_index()
cstlist.columns=['name','cnt']
n['cnt']=n['cst'].map(cstlist.loc[:, ['name','cnt']].set_index('name').iloc[:,0].to_dict())

Надеюсь, это сработает

Другие вопросы по тегам