繁体   English   中英

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

[英]Groupby count as one column and groupby number of unique values of another column in pandas

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

您可以使用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

一种选择是对数据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} 

至少在0.25版本中,将agg与字典一起使用(如在其他答案中一样)会导致警告: FutureWarning:不建议在Series上使用dict进行聚合,并且将在以后的版本中将其删除

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM