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

d13*_*337 49 python pandas

我在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)

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

  • 在pandas 20.3中,@ jezraels的`df ['size'] = df.groupby(['A','B']).A .transform(np.size)`有效; 没有`.A`你得到"ValueError:错误的项目数量传递2,放置意味着1",即"得到2列,需要1". (3认同)
  • 此外,您的解决方案在玩具示例上运行良好,但在实际数据上返回错误http://pastebin.com/aCsMxCd5 (2认同)

jez*_*ael 24

您需要- 的是和以前一样:transform sizelendf

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.sizeNaN显然不是像以前一样:

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)

  • 这正是我最后所做的... `(full_df .set_index('cdatetime') .groupby(['Cluster', 'source', 'action', pd.Grouper(freq = 'H', sort = True)]) .size() .reset_index(['Cluster', 'source', 'action']) .rename(columns={0: 'cnt'}) )` (2认同)

Myk*_*tko 8

您可以设置as_index参数来groupby获取FalseDataFrame 而不是 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)