【问题标题】:How to sort Pandas DataFrame both by MultiIndex and by value?如何按 MultiIndex 和按值对 Pandas DataFrame 进行排序?
【发布时间】:2018-08-22 04:50:09
【问题描述】:

样本数据:

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

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    以防其他人也使用 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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 谢谢,这个解决方案正好说明了我的问题:后面的 sort_index() 覆盖了前面的值排序。我用更多数据和预期结果更新了这个问题。建议的解决方案给出的结果与任何排序前完全相同。
      • 更新了问题。
      • 感谢更新的答案!现在我看到了它是如何工作的。欣赏。
      【解决方案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
      

      【讨论】:

      • 感谢您的回答并让我注意到inplace 参数和reset_index()。我接受了另一个答案,因为它还恢复了初始多索引。
      • 您可以取消删除stackoverflow.com/questions/49296346/…,您只需要使用ipython 运行.py 文件,而不仅仅是简单的python
      猜你喜欢
      • 2016-12-01
      • 2017-10-16
      • 2016-09-14
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2017-09-14
      • 2016-07-02
      • 2014-11-29
      相关资源
      最近更新 更多