8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

Study Planet 1月前

43 0

我在 groupby 结果上使用 .size() 来计算每个组中有多少个项目。我希望将结果保存到新的列名中,而无需手动编辑列名数组,...

我正在使用 .size() groupby 结果来计算每个组中有多少个项目。

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

这是我尝试过的:

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

我得到的错误是:

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

帖子版权声明 1、本帖标题:如何为 size() 列指定名称?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Study Planet在本站《dataframe》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 结果 df.groupby(...) 不是 DataFrame。要返回 DataFrame,您必须对每个组应用函数、转换组中的每个元素或筛选组。

    看起来您想要一个 DataFrame,其中包含 (1) 所有原始数据 df 和 (2) 每个组中数据的数量。这些东西的长度不同,因此如果它们需要放入同一个 DataFrame,您需要重复列出大小,即每个组中的每一行。

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

    (附言:如果您能展示简洁的样本输入和预期结果,将会很有帮助。)

  • 我还发现这几乎是相等的(创建一个新的数据框),但不确定它在效率方面与您的解决方案相比如何。com/questions/10373660/…

  • 而且您的解决方案在玩具示例上运行良好,但在实际数据上会返回错误 pastebin.com/aCsMxCd5

  • 在 pandas 20.3 中,@jezraels 的 df['size'] = df.groupby(['A','B']) .A .transform(np.size) 可以工作;如果没有 .A,您会得到 \'ValueError: 传递的项目数错误 2,位置意味着 1\',即 \'有 2 列,需要 1\'。

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

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

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

  • 您需要 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 显然 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 = 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(['A', 'B']).size().reset_index(name='Size') 相同的事情呢?

  • 那么类似于...reset_index('V1', name = 'size')?

  • @Sotos 嗯,这样不行。需要 .reset_index().rename(columns='index':'col', 'anothercol':'col2')

  • 这正是我最后所做的...... (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'}) )

  • alp 1月前 0 只看Ta
    引用 12

    您可以设置 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
    
  • SSS 1月前 0 只看Ta
    引用 13

    假设 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())
    

    希望这会有用

返回
作者最近主题: