我正在使用.size()
groupby 结果来计算每个组中有多少项目。
我希望在不手动编辑列名数组的情况下将结果保存到新的列名,怎么做?
这是我尝试过的:
grpd = df.groupby(['A','B'])
grpd['size'] = grpd.size()
grpd
和我得到的错误:
TypeError: 'DataFrameGroupBy' 对象不支持项目分配(在第二行)
DataFrameGroupBy 对象的.size()
内置方法实际上返回具有组大小的 Series 对象,而不是 DataFrame。如果您想要一个 DataFrame,其列是组大小,由组索引,具有自定义名称,您可以使用该.to_frame()
方法并将所需的列名称用作其参数。
grpd = df.groupby(['A','B']).size().to_frame('size')
如果您希望这些组再次成为列,您可以.reset_index()
在最后添加一个。
你需要- of和以前一样:transform
size
len
df
注意:
此处需要在 之后添加一列groupby
,否则会出现错误。因为GroupBy.size
countNaN
也是,所以使用什么列并不重要。所有列的工作方式相同。
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
ofdf
显然与以前不同:
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
结果df.groupby(...)
不是 DataFrame。要取回 DataFrame,您必须对每个组应用一个函数、转换组的每个元素或过滤组。
似乎您想要一个包含(1)所有原始数据df
和(2)每组中有多少数据的数据帧。这些东西有不同的长度,所以如果它们需要进入同一个DataFrame,你需要冗余地列出大小,即每组中的每一行。
df['size'] = df.groupby(['A','B']).transform(np.size)
(旁白:如果您可以显示简洁的样本输入和预期结果,这将很有帮助。)
您可以将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 是数据框的名称,而 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())
希望这会奏效