Pandas 如何按列值排序多索引数据帧并维护多索引结构?

Pandas 如何按列值排序多索引数据帧并维护多索引结构?,pandas,dataframe,sorting,multi-index,Pandas,Dataframe,Sorting,Multi Index,我有一个多索引(TestName和TestResult.output)数据框架,希望按列值降序排序,并维护可视的多索引对(TestName和TestResult.output)。我怎样才能做到这一点 例如,我想按列“n*%”对TestResult的desc进行排序。结果索引值“Failed”如下表所示: 我希望实现以下结果,在索引中保持通过-失败对: 我试过这个: orderedByTotalNxPercentDesc = myDf.sort_values(['TestResult.Outc

我有一个多索引(TestName和TestResult.output)数据框架,希望按列值降序排序,并维护可视的多索引对(TestName和TestResult.output)。我怎样才能做到这一点

例如,我想按列“n*%”对TestResult的desc进行排序。结果索引值“Failed”如下表所示:

我希望实现以下结果,在索引中保持通过-失败对:

我试过这个:

orderedByTotalNxPercentDesc = myDf.sort_values(['TestResult.Outcome','n * %'], ascending=False)
但该命令首先按index values=“Passed”排序,并断开传递的失败索引对 这可以帮助您:

import pandas as pd
import numpy as np

arrays = [np.array(["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"]),np.array(["one", "two", "one", "two", "one", "two", "one", "two"])]

df = pd.DataFrame(np.random.randn(8, 4), index=arrays)

df.reset_index().groupby(["level_0"]).apply(lambda x: x.sort_values([3], ascending = False)).set_index(['level_0','level_1'])
在您的情况下,
3
是您的列
n*%
level\u 0
是您的索引
TestName
level\u 1
是您的
测试结果

变成:


通过创建一个虚拟列进行排序,我可以得到我想要的:

iterables = [["bar", "baz", "foo", "qux"], ["one", "two"]]

df = pd.DataFrame(np.random.randn(8, 1), index=arrays)
df.index.names = ['level_0', 'level_1']
df = df.rename(columns={0: "myvalue"}, errors='raise')

for index, row in df.iterrows():
    df.loc[index,'sort_dummy'] = df.loc[(index[0],'two'),'myvalue']

df = df.sort_values(['sort_dummy'], ascending = False)
df
输出:


我不确定我是否理解正确,但如果您想要配对,请使用
groupby
TestName
是有意义的。谢谢您的提示,很遗憾,这不是我想要的。您首先按级别0排序,然后在级别0索引中按第3列排序。这仅对每个级别0索引中的级别1“1 2”索引进行排序。你可以再看看我的“我想实现”截图。在你的例子中,你需要先按第3列对所有的级别0进行排序,并保持级别1对。啊,明白了。将尝试跟进。编辑了我的答案。