Python 如何在不修改数据帧的情况下,同时按列和部分多索引对数据帧进行排序

Python 如何在不修改数据帧的情况下,同时按列和部分多索引对数据帧进行排序,python,pandas,Python,Pandas,鉴于: 如何同时按多索引的某些列和某些级别进行排序(在本例中,假设多索引的级别为1,然后按列0进行排序) 我知道我可以将部分多重索引传播到列: mi1 = MultiIndex.from_tuples([('bar', 'y'), ('bar', 'z'), ('baz', 'y'), ('baz', 'z'), ('foo', 'y'), ('foo', 'z')]) dfa = DataFrame(random.rand(6),index=mi1) 但是如何在没有这个传播步骤的情况下进行

鉴于:

如何同时按多索引的某些列和某些级别进行排序(在本例中,假设多索引的级别为1,然后按列0进行排序)

我知道我可以将部分多重索引传播到列:

mi1 = MultiIndex.from_tuples([('bar', 'y'), ('bar', 'z'), ('baz', 'y'), ('baz', 'z'), ('foo', 'y'), ('foo', 'z')])

dfa = DataFrame(random.rand(6),index=mi1)
但是如何在没有这个传播步骤的情况下进行排序呢

@user2360798有一个类似的问题,但没有人回答问题中列/索引部分的同时排序:
重置索引很容易

用名称构造索引(不是必需的,但信息更丰富)

重置将所有索引放入列中,排序,然后还原

In [23]: mi1 = MultiIndex.from_tuples([('bar', 'y'), ('bar', 'z'), ('baz', 'y'), ('baz', 'z'), ('foo', 'y'), ('foo', 'z')],names=['first','second'])

In [24]: dfa = DataFrame(np.random.randn(6),index=mi1)

In [25]: dfa
Out[25]: 
                          0
first second               
bar   y       0.18574062599
      z      -0.82120720368
baz   y      -0.05645183973
      z      -1.07579609513
foo   y      -1.03528813447
      z      -0.46439965218

[6 rows x 1 columns]

对于熊猫
0.23.0
,可以进行排序:



同时,您必须优先考虑索引或列,这是什么意思?因此
dfa.sort([0]).sortlevel(level=1)
或以相反的顺序
dfa.sortlevel(level=1).sort([0])
。您是对的,对此表示抱歉。我的意思是,在级别1中出现平局时,按级别1排序,然后按列0排序。
In [23]: mi1 = MultiIndex.from_tuples([('bar', 'y'), ('bar', 'z'), ('baz', 'y'), ('baz', 'z'), ('foo', 'y'), ('foo', 'z')],names=['first','second'])

In [24]: dfa = DataFrame(np.random.randn(6),index=mi1)

In [25]: dfa
Out[25]: 
                          0
first second               
bar   y       0.18574062599
      z      -0.82120720368
baz   y      -0.05645183973
      z      -1.07579609513
foo   y      -1.03528813447
      z      -0.46439965218

[6 rows x 1 columns]
In [26]: dfa.reset_index().sort(columns=['second',0]).set_index(dfa.index.names)
Out[26]: 
                          0
first second               
foo   y      -1.03528813447
baz   y      -0.05645183973
bar   y       0.18574062599
baz   z      -1.07579609513
bar   z      -0.82120720368
foo   z      -0.46439965218

[6 rows x 1 columns]
mi1 = pd. MultiIndex.from_tuples([('bar', 'y'), ('bar', 'z'), ('baz', 'y'), ('baz', 'z'), ('foo', 'y'), ('foo', 'z')],names=['first','second'])

dfa = pd.DataFrame({'col':[1,4,5,6,1,2]},index=mi1)
print (dfa)
              col
first second     
bar   y         1
      z         4
baz   y         5
      z         6
foo   y         1
      z         2

df = dfa.sort_values(['second','col'])
print (df)
              col
first second     
bar   y         1
foo   y         1
baz   y         5
foo   z         2
bar   z         4
baz   z         6