【问题标题】:Groupby count as one column and groupby number of unique values of another column in pandasGroupby 计数为一列和 groupby 熊猫中另一列的唯一值的数量
【发布时间】:2020-01-16 15:50:24
【问题描述】:

我有一个如下所示的数据框。它只有两列 Sector 和 Raised_By。


我的数据框:

Sector     Raised_By        
A          Xavi
B          Ramos
C          Beckham
B          Ronaldo
A          Messi
A          Messi
C          Oven
B          Ramos
C          Ronaldo
A          Messi
C          Ronaldo
C          Beckham

从上面的数据框中,我想准备如下所示的数据框。


预期输出:

Sector  Total_Number_of_Times_Raised  Number_unique_Raised_By    Unique_Raised_By
A       4                             2                         ['Xavi', 'Messi']
B       3                             2                        ['Ramos', 'Ronaldo']
C       5                             3                      ['Beckham', 'Ronaldo', 'Oven']

我尝试了以下代码

c = df.groupby(['Sector']).size().reset_index(name='Total_Number_of_Times_Raised').sort_values(['Total_Number_of_Times_Raised'], 
                    ascending =False)

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    一种选择是pivot_table 指定不同的聚合函数

    df.pivot_table(index=df.Sector, values='Raised_By', aggfunc=['count', 'nunique', set])
    

               count   nunique                           set
           Raised_By Raised_By                     Raised_By
    Sector                                                     
    A              4         2                 {Messi, Xavi}
    B              3         2              {Ramos, Ronaldo}
    C              5         3      {Oven, Ronaldo, Beckham} 
    

    【讨论】:

      【解决方案2】:

      你可以使用pandas.Series.aggregate:

      df.groupby('Sector')['Raised_By'].agg({'Total_Number_of_Times_Raised':'count','Number_unique_Raised_By':'nunique','Unique_Raised_By':'unique'}).reset_index()
      

      输出:

        Sector  Total_Number_of_Times_Raised  Number_unique_Raised_By  Unique_Raised_By 
      0      A                             4                        2  [Xavi, Messi]  
      1      B                             3                        2  [Ramos, Ronaldo] 
      2      C                             5                        3  [Beckham, Oven, Ronaldo]
      

      注意: 最后你可以使用或不使用reset_index

      【讨论】:

        【解决方案3】:

        至少在 0.25 版本中,agg 与字典一起使用(如在其他 答案),导致警告:FutureWarning: using a dict on a Series for 聚合已弃用,将在未来的版本中删除

        更现代的解决方案是使用命名聚合

        df.groupby('Sector').Raised_By.agg(
            Total_Number_of_Times_Raised='count',
            Number_unique_Raised_By='nunique',
            Unique_Raised_By='unique').reset_index()
        

        【讨论】:

          猜你喜欢
          • 2022-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-24
          • 1970-01-01
          • 2017-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多