【问题标题】:How can I groupby a DataFrame at the same time I count the values and put in different columns?如何在计算值并放入不同列的同时对 DataFrame 进行分组?
【发布时间】:2022-01-19 18:08:21
【问题描述】:

我有一个如下所示的 DataFrame

Index  Category  Class
 0        1        A
 1        1        A
 2        1        B
 3        2        A
 4        3        B
 5        3        B

我想获得一个按类别分组的输出数据框,并为每个类设置一列,并计算每个类别中该类的出现次数,例如下面的一个

Index Category   A   B
 0      1        2   1
 1      2        1   0
 2      3        0   2

到目前为止,我已经尝试了groupbyagg 方法的各种组合,但我仍然无法得到我想要的。我也试过df.pivot_table(index='Category', columns='Class', aggfunc='count'),但它返回一个没有列的DataFrame。有什么想法可以在这种情况下起作用吗?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    您可以使用aggfunc="size" 来达到您想要的结果:

    >>> df.pivot_table(index='Category', columns='Class', aggfunc='size', fill_value=0)
    
    Class     A  B
    Category
    1         2  1
    2         1  0
    3         0  2
    

    或者,您可以使用.groupby(...).size() 来获取计数,然后也可以通过 unstack 来重塑您的数据:

    >>> df.groupby(["Category", "Class"]).size().unstack(fill_value=0)
    
    Class     A  B
    Category
    1         2  1
    2         1  0
    3         0  2
    

    【讨论】:

      【解决方案2】:

      分配一个虚拟值来计数:

      out = df.assign(val=1).pivot_table('val', 'Category', 'Class',
                                         aggfunc='count', fill_value=0).reset_index()
      print(out)
      
      # Output
      Class  Category  A  B
      0             1  2  1
      1             2  1  0
      2             3  0  2
      

      【讨论】:

        【解决方案3】:
            import pandas as pd
        df = pd.DataFrame({'Index':[0,1,2,3,4,5],
                           'Category': [1,1,1,2,3,3],
                           'Class':['A','A','B','A','B','B'],
                      })
        df = df.groupby(['Category', 'Class']).count()
        df = df.pivot_table(index='Category', columns='Class')
        print(df)
        

        输出:

                     Index     
        Class        A    B
        Category           
        1          2.0  1.0
        2          1.0  NaN
        3          NaN  2.0
        

        【讨论】:

          【解决方案4】:

          使用crosstab:

          pd.crosstab(df['Category'], df['Class']).reset_index()
          

          输出:

          Class  Category  A  B
          0             1  2  1
          1             2  1  0
          2             3  0  2
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-14
            • 2014-07-10
            • 2015-04-22
            • 2022-11-22
            • 1970-01-01
            相关资源
            最近更新 更多