按Groupby熊猫中的第二列对值进行排序

时间:2019-01-27 14:06:20

标签: python pandas

我有以下数据框:

data = {
    'CH': [0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1],
    'Z': [10, 11, 10, 12, 13, 10, 11, 12, 13, 14, 11, 13, 10, 11, 12, 13, 14, 14, 14],
    'Res': [23, 43, 21, 23, 43, 9, 21, 13, 23, 43, 31, 27, 31, 33, 54, 17, 19, 23, 33]
    }

df = pd.DataFrame(data)

如果我做df.groupby(['CH', 'Z']).mean(),则会得到以下信息:

Pandas groupby

我希望能够按Z列的降序对值进行排序。

我也想按Res列中的值对值进行排序,但第一个是最重要的。

谢谢。

4 个答案:

答案 0 :(得分:1)

首先按“ Z”排序,然后按“ Res”排序

dfs = df.groupby(['CH', 'Z']) \
          .mean() \
          .reset_index() \
          .sort_values(['Z', 'Res'], ascending=False)

如果有必要保留类似于groupby结果的多索引:

dfs.set_index(['CH', 'Z'])

答案 1 :(得分:0)

您可以使用pandas.DataFrame.sort_values,因为pandas.DataFrame.sortdeprecated

df.groupby(['CH', 'Z']).mean().sort_values(by='Z', ascending=False)

如果要按Res进行排序,只需更改传递给by参数的值

df.groupby(['CH', 'Z']).mean().sort_values(by='Res')

答案 2 :(得分:0)

您还可以在groupby语句中调用sort_index,这将保留索引并对其进行排序,而不必使用set_index()

df_res=df.groupby(['CH', 'Z']).mean().sort_values('Res',ascending=False).sort_index(level=1,ascending=False)
print(df_res)

       Res
CH Z       
1  14 33.00
0  14 28.33
1  13 23.00
0  13 29.00
1  12 38.50
0  12 13.00
1  11 38.00
0  11 26.00
1  10 31.00
0  10 17.67

答案 3 :(得分:0)

  

我希望能够按Z列对值进行排序...然后   由Res

清除一些术语:Z索引级别,而Res系列。熊猫通过sort_values帮助隐藏了这种区别。只需指定ascending参数即可与您希望排序的组件对齐:

res = df.groupby(['CH', 'Z']).mean()\
        .sort_values(['Z', 'Res'], ascending=[False, True])

print(res)

             Res
CH Z            
0  14  28.333333
1  14  33.000000
   13  23.000000
0  13  29.000000
   12  13.000000
1  12  38.500000
0  11  26.000000
1  11  38.000000
0  10  17.666667
1  10  31.000000