Как назначить имя столбцу 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()
в конце.
Тебе нужно transform
size
- 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())
Надеюсь, это сработает