[英]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.