【问题标题】:How sort multiindex dataframe by column value and maintain multiindex structure?如何按列值对多索引数据帧进行排序并维护多索引结构?
【发布时间】:2021-04-12 00:55:32
【问题描述】:

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

例如,我想按列“n * %”对TestResult.Outcome索引值“失败”进行排序如下表:

我想实现以下结果,同时保持索引中的 Pass Fail 对:

我试过了:

orderedByTotalNxPercentDesc = myDf.sort_values(['TestResult.Outcome','n * %'], ascending=False)

但这首先按索引值排序=“通过”并打破通过失败的索引对

【问题讨论】:

  • 不确定我是否理解正确,但如果你想拥有这对,groupby TestName 是有意义的。

标签: pandas dataframe sorting multi-index


【解决方案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

输出:

【讨论】:

    【解决方案2】:

    这可以帮助你:

    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_0 是您的索引 TestNamelevel_1 是您的 TestResult.Outcome

    变成:

    【讨论】:

    • 感谢您的提示,不幸的是这不是我想要的。您首先按 level_0 排序,然后在 level_0 索引中按第 3 列排序。这只对每个 level_0 索引中的 level_1“一二”索引进行排序。你可以再看看我的“我想实现”截图。在您的示例中,需要首先在所有 level_0 中按第 3 列排序,并希望保留 level_1 对。
    • 啊,明白了。将尝试跟进。
    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 2015-08-27
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多