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

Posted

技术标签:

【中文标题】pandas 按另一列的平均值对一列的值进行排序【英文标题】:pandas sort values of one column by the average of the other column 【发布时间】:2019-04-02 10:57:14 【问题描述】:

假设我有以下数据框:

    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,因此我想对数据帧进行排序,使 dog 排在第一位,然后是 cat,然后是 bird,像下面这样:

    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】:

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

【讨论】:

以上是关于pandas 按另一列的平均值对一列的值进行排序的主要内容,如果未能解决你的问题,请参考以下文章

将一列的多个结果行连接成一个,按另一列分组[重复]

如何按一列的最大值获取SQL行,按另一列分组

根据另一列中的值删除一列的重复项,Python,Pandas

Mysql,如何使用另一列的最大值对一组行进行分组?

如何通过另一列的值 pandas 聚合 groupBy [重复]

Pandas Multiindex Groupby 聚合列与另一列的值