Groupby计为一列,Groupby计为另一列的唯一值的数量

时间:2019-09-15 16:41:39

标签: python pandas dataframe pandas-groupby

我有一个数据框,如下所示。其中只有两列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)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

一种选择是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 :(得分:1)

至少在版本 0.25 中, agg 与字典一起使用(与其他 答案),则显示警告: FutureWarning:对系列使用字典 不建议使用聚合功能,并且将在以后的版本中将其删除。

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

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