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