Pandas 如何按列值排序多索引数据帧并维护多索引结构?
我有一个多索引(TestName和TestResult.output)数据框架,希望按列值降序排序,并维护可视的多索引对(TestName和TestResult.output)。我怎样才能做到这一点 例如,我想按列“n*%”对TestResult的desc进行排序。结果索引值“Failed”如下表所示: 我希望实现以下结果,在索引中保持通过-失败对: 我试过这个: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
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对。啊,明白了。将尝试跟进。编辑了我的答案。