如何为size()列指定名称?

时间:2013-08-01 13:11:07

标签: python pandas

我在groupby结果上使用.size()以计算每组中的项目数。

我希望将结果保存到新的列名而无需手动编辑列名数组,怎么办呢?

由于

这就是我的尝试:

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

我得到的错误:

  

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

4 个答案:

答案 0 :(得分:45)

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

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

如果您希望这些群组再次成为列,则可以在末尾添加.reset_index()

答案 1 :(得分:29)

df.groupby(...)的结果不是DataFrame。要重新获取DataFrame,您必须将函数应用于每个组,转换组的每个元素或过滤组。

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

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

(旁白:如果您能够显示简洁的样本输入和预期结果,这将非常有用。)

答案 2 :(得分:16)

您需要transform size - len 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的{​​{1}}显然与以前相同:

df

答案 3 :(得分: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())

希望这会起作用