我在groupby结果上使用.size()以计算每组中的项目数。
我希望将结果保存到新的列名而无需手动编辑列名数组,怎么办呢?
由于
这就是我的尝试:
grpd = df.groupby(['A','B'])
grpd['size'] = grpd.size()
grpd
我得到的错误:
TypeError:'DataFrameGroupBy'对象不支持项目分配 (在第二行)
答案 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())
希望这会起作用