83

我正在使用.size()groupby 结果来计算每个组中有多少项目。

我希望在不手动编辑列名数组的情况下将结果保存到新的列名,怎么做?

这是我尝试过的:

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

和我得到的错误:

TypeError: 'DataFrameGroupBy' 对象不支持项目分配(在第二行)

4

5 回答 5

97

DataFrameGroupBy 对象的.size()内置方法实际上返回具有组大小的 Series 对象,而不是 DataFrame。如果您想要一个 DataFrame,其列是组大小,由组索引,具有自定义名称,您可以使用该.to_frame()方法并将所需的列名称用作其参数。

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

如果您希望这些组再次成为列,您可以.reset_index()在最后添加一个。

于 2016-11-29T17:56:47.803 回答
48

你需要- of和以前一样:transform sizelendf

注意:

此处需要在 之后添加一列groupby,否则会出现错误。因为GroupBy.sizecountNaN也是,所以使用什么列并不重要。所有列的工作方式相同。

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- lenofdf显然与以前不同

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
于 2016-07-06T13:12:33.543 回答
41

结果df.groupby(...)不是 DataFrame。要取回 DataFrame,您必须对每个组应用一个函数、转换组的每个元素或过滤组。

似乎您想要一个包含(1)所有原始数据df和(2)每组中有多少数据的数据帧。这些东西有不同的长度,所以如果它们需要进入同一个DataFrame,你需要冗余地列出大小,即每组中的每一行。

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

(旁白:如果您可以显示简洁的样本输入和预期结果,这将很有帮助。)

于 2013-08-01T13:15:13.700 回答
3

您可以将as_index参数设置groupbyFalse以获取 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
于 2021-09-01T06:59:02.257 回答
0

假设 n 是数据框的名称,而 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())

希望这会奏效

于 2018-05-24T11:42:16.467 回答