熊猫按另一列的平均值对一列的值进行排序

时间:2018-10-29 13:37:32

标签: python pandas sorting group-by pandas-groupby

假设我具有以下数据框:

    A    B
1  cat   3
2  cat   7
3  dog   5
4  dog   8
5  dog   11 
6  bird  3
7  bird  5

'cat'的平均值为5,'dog'的平均值为8,'bird'的平均值为4,因此我想对数据框进行排序,以使狗比猫和鸟更优先。类似于以下内容:

    A    B
1  dog   5
2  dog   8
3  dog   11
4  cat   3
5  cat   7
6  bird  3
7  bird  5

什么是最好的方法? 我试图将“ A”列设置为索引,而不是对其进行排序,但我无法弄清楚。 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

GroupBy.transformmean一起用于一系列与原始DataFrame大小相同的聚合值,然后使用argsort in descending order进行排名,并按DataFrame.iloc重新排序:

df = df.iloc[(-df.groupby('A')['B'].transform('mean')).argsort()]
print (df)
      A   B
3   dog   5
4   dog   8
5   dog  11
1   cat   3
2   cat   7
6  bird   3
7  bird   5

或将汇总值转换为有序的Categorical,然后转换为sort_values

a = df.groupby('A')['B'].mean().sort_values(ascending=False)

df['A'] = pd.Categorical(df['A'], ordered=True, categories=a.index)
df = df.sort_values('A')
print (df)
      A   B
3   dog   5
4   dog   8
5   dog  11
1   cat   3
2   cat   7
6  bird   3
7  bird   5