【问题标题】:Efficient column MultiIndex ordering高效的列 MultiIndex 排序
【发布时间】:2021-03-12 16:05:25
【问题描述】:

我有这个数据框:

df = pandas.DataFrame({'A' : [2000, 2000, 2000, 2000, 2000, 2000], 
                       'B' : ["A+", 'B+', "A+", "B+", "A+", "B+"],
                       'C' : ["M", "M", "M", "F", "F", "F"],
                       'D' : [1, 5, 3, 4, 2, 6],
                       'Value' : [11, 12, 13, 14, 15, 16] }).set_index((['A', 'B', 'C', 'D']))

df = df.unstack(['C', 'D']).fillna(0)

我想知道是否有一种更优雅的方式来对列 MultiIndex 进行排序,如下代码:

# rows ordering
df = df.sort_values(by = ['A', "B"], ascending = [True, True])
# col ordering
df = df.transpose().sort_values(by = ["C", "D"], ascending = [False, False]).transpose() 

特别是我觉得最后一行的两个转置 si 比它应该的要复杂得多。我尝试使用 sort_index,但无法在 MultiIndex 上下文中使用它(对于行和列)。

【问题讨论】:

  • df.sort_index(level=[0,1],axis=1,ascending=False) ?
  • df.sort_index(level=[0,1],axis=1,ascending=[True, False]) 可以解决问题。您可以将其发布为答案

标签: pandas dataframe sorting multi-index


【解决方案1】:

您可以在两个级别上使用排序索引:

out = df.sort_index(level=[0,1],axis=1,ascending=[True, False])

【讨论】:

  • 确实如此,但在每个级别上都有不同的过滤(一个升序,一个降序)
【解决方案2】:

我可以使用

axis=1

因此最后一行变成了

df = df.sort_values(axis = 1, by = ["C", "D"], ascending = [True, False])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多