我在groupby结果上使用.size()来计算每个组中有多少项.
我希望将结果保存到新的列名而无需手动编辑列名数组,如何才能完成?
谢谢
这是我尝试过的:
grpd = df.groupby(['A','B'])
grpd['size'] = grpd.size()
grpd
Run Code Online (Sandbox Code Playgroud)
和我得到的错误:
TypeError:'DataFrameGroupBy'对象不支持项目分配(在第二行)
Sea*_*der 51
.size()
DataFrameGroupBy对象的内置方法实际上返回一个具有组大小而不是DataFrame的Series对象.如果您想要一个DataFrame,其列是组大小,由组索引,并带有自定义名称,您可以使用该.to_frame()
方法并使用所需的列名作为其参数.
grpd = df.groupby(['A','B']).size().to_frame('size')
Run Code Online (Sandbox Code Playgroud)
如果您希望组再次成为列,则可以.reset_index()
在末尾添加a .
Dan*_*lan 30
结果df.groupby(...)
不是DataFrame.要重新获取DataFrame,您必须将函数应用于每个组,转换组的每个元素或过滤组.
您似乎想要一个包含(1)所有原始数据的DataFrame,df
以及(2)每组中数据的数量.这些东西有不同的长度,所以如果他们需要进入相同的DataFrame,你需要冗余地列出大小,即每个组中的每一行.
df['size'] = df.groupby(['A','B']).transform(np.size)
Run Code Online (Sandbox Code Playgroud)
(旁白:如果您能够显示简洁的样本输入和预期结果,那将非常有用.)
jez*_*ael 24
您需要- 的是和以前一样: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
Run Code Online (Sandbox Code Playgroud)
如果需要在聚集集列名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 = 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
Run Code Online (Sandbox Code Playgroud)
您可以设置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()
Run Code Online (Sandbox Code Playgroud)
输出:
A B size
0 a 1 1
1 a 2 1
2 b 2 2
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28735 次 |
最近记录: |