Как назначить имя столбцу size()?
Я использую .size() для результата group, чтобы подсчитать количество элементов в каждой группе.
Я хочу, чтобы результат был сохранен в новое имя столбца без ручного редактирования массива имен столбцов, как это можно сделать?
Спасибо
Вот что я пробовал:
grpd = df.groupby(['A','B'])
grpd['size'] = grpd.size()
grpd
и полученная ошибка:
TypeError: объект DataFrameGroupBy не поддерживает назначение элемента (на второй строке)
Ответы
Ответ 1
Результат df.groupby(...)
не является DataFrame. Чтобы вернуть DataFrame, вам необходимо применить функцию к каждой группе, преобразовать каждый элемент группы или фильтровать группы.
Похоже, вы хотите, чтобы DataFrame содержал (1) все ваши исходные данные в df
и (2) количество данных в каждой группе. Эти вещи имеют разную длину, поэтому, если им нужно зайти в один и тот же DataFrame, вам нужно будет перечислять размер избыточно, т.е. Для каждой строки в каждой группе.
df['size'] = df.groupby(['A','B']).transform(np.size)
(Кроме того: полезно, если вы можете показать сжатый ввод проб и ожидаемые результаты.)
Ответ 2
Встроенный метод объектов .size()
объектов DataFrameGroupBy фактически возвращает объект Series с размерами группы, а не DataFrame. Если вы хотите, чтобы DataFrame, чей столбец был размером группы, индексированный группами, с настраиваемым именем, вы можете использовать метод .to_frame()
и использовать в качестве аргумента имя требуемого столбца.
grpd = df.groupby(['A','B']).size().to_frame('size')
Если вы хотите, чтобы группы были столбцами снова, вы можете добавить .reset_index()
в конец.
Ответ 3
Вам нужно transform
size
- len
of df
такой же, как и раньше:
Обратите внимание:
Здесь необходимо добавить один столбец после groupby
, иначе вы получите ошибку. Поскольку значение GroupBy.size
NaN
, то какой столбец используется, не имеет значения. Все колонки работают одинаково.
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
of 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
Ответ 4
допустим, 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())
Надеюсь это сработает