【问题标题】:pandas sort values of one column by the average of the other columnpandas 按另一列的平均值对一列的值进行排序
【发布时间】: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”列设置为索引,而不是对其进行排序,但我无法弄清楚。 任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2016-03-24
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2012-10-09
      相关资源
      最近更新 更多