如何通过MultiIndex和值对Pandas DataFrame进行排序?

时间:2018-03-13 19:35:35

标签: python pandas pandas-groupby

示例数据:

mdf = pd.DataFrame([[1,2,50],[1,2,20],
                [1,5,10],[2,8,80],
                [2,5,65],[2,8,10]
               ], columns=['src','dst','n']); mdf

    src dst n
0   1   2   50
1   1   2   20
2   1   5   10
3   2   8   80
4   2   5   65
5   2   8   10

groupby()提供了一个两级多指数:

test = mdf.groupby(['src','dst'])['n'].agg(['sum','count']); test

        sum count
src dst 
1   2   70  2
    5   10  1
2   5   65  1
    8   90  2

问题:如何按src升序然后按sum降序对此DataFrame进行排序?

我是pandas的初学者,了解了sort_index()和sort_values(),但在这项任务中我似乎需要同时进行。

预期结果,在每个" src"排序由" sum":

决定
        sum count
src dst 
1   2   70  2
    5   10  1
2   8   90  2
    5   65  1

3 个答案:

答案 0 :(得分:3)

IIUC:

In [29]: test.sort_values('sum', ascending=False).sort_index(level=0)
Out[29]:
         sum  count
src dst
1   2     80      2
    5     10      1
2   8     80      1

更新:@anonyXmous's solution非常相似:

In [47]: (test.reset_index()
              .sort_values(['src','sum'], ascending=[1,0])
              .set_index(['src','dst']))
Out[47]:
         sum  count
src dst
1   2     70      2
    5     10      1
2   8     90      2
    5     65      1

答案 1 :(得分:3)

您可以重置索引,然后按所选列对其进行排序。希望这会有所帮助。

import pandas as pd

mdf = pd.DataFrame([[1,2,50],[1,2,20],
                [1,5,10],[2,8,80],
                [2,5,65],[2,8,10]
               ], columns=['src','dst','n']); 
mdf = mdf.groupby(['src','dst'])['n'].agg(['sum','count']); 
mdf.reset_index(inplace=True)
mdf.sort_values(['src', 'sum'], ascending=[True, False], inplace=True)
print(mdf)

Result:
       src dst sum  count
    0   1   2   70   2
    1   1   5   10   1
    3   2   8   90   2
    2   2   5   65   1

答案 2 :(得分:2)

如果其他人也使用google遇到此问题。从pandas 0.23版开始,您可以将级别名称作为参数传递给sort_values

test.sort_values(['src','sum'], ascending=[1,0])

Result:
         sum  count
src dst            
1   2     70      2
    5     10      1
2   8     90      2
    5     65      1