【问题标题】:Reorder Multiindex Pandas Dataframe重新排序多索引 Pandas 数据框
【发布时间】:2019-02-05 20:13:02
【问题描述】:

我想重新排序数据框中的列,并将基础值保留在正确的列中。

例如,这是我拥有的数据框

cols = [ ['Three', 'Two'],['A', 'D', 'C', 'B']]
header = pd.MultiIndex.from_product(cols)
df = pd.DataFrame([[1,4,3,2,5,8,7,6]]*4,index=np.arange(1,5),columns=header)                  
df.loc[:,('One','E')] = 9
df.loc[:,('One','F')] = 10

>>> df

我想将其更改如下:

header2 = pd.MultiIndex(levels=[['One', 'Two', 'Three'], ['E', 'F', 'A', 'B', 'C', 'D']],
       labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2], [0, 1, 2, 3, 4, 5, 2, 3, 4, 5]])

df2 = pd.DataFrame([[9,10,1,2,3,4,5,6,7,8]]*4,index=np.arange(1,5), columns=header2)
>>>>df2

【问题讨论】:

  • 单独的问题 - 我使用哪种语法来显示数据框
  • 您在第一个和第二个 DataFrame 中的 MultiIndex 不一样...您到底想做什么?
  • 基本上我正在尝试重新排序列,将顶部标题更改为“一”、“二”、“三”,对于“二”和“三”标题,重新排序底部标题为 'A','B','C','D'
  • 你能解释一下为什么最后的排序是“一二三”而不是“一三二”吗?
  • 这只是一个例子,关键是我正在寻找一种方法将列按任何特定顺序(不一定按字母顺序)

标签: python pandas dataframe multi-index


【解决方案1】:

首先,在顶层定义一个分类排序。然后,在两个级别的第一个轴上调用sort_index

v = pd.Categorical(df.columns.get_level_values(0), 
                   categories=['One', 'Two', 'Three'], 
                   ordered=True)
v2 = pd.Categorical(df.columns.get_level_values(1), 
                    categories=['E', 'F', 'C', 'B', 'A', 'D'],
                    ordered=True)
df.columns = pd.MultiIndex.from_arrays([v, v2]) 

df = df.sort_index(axis=1, level=[0, 1])

df
  One     Two          Three         
    E   F   C  B  A  D     C  B  A  D
1   9  10   7  6  5  8     3  2  1  4
2   9  10   7  6  5  8     3  2  1  4
3   9  10   7  6  5  8     3  2  1  4
4   9  10   7  6  5  8     3  2  1  4

【讨论】:

  • 谢谢,但现在顶部标题的顺序不正确(一、三、二),我认为它适用于底部标题,因为在此示例中,所需的顺序是按字母顺序排列的,但我正在寻找一种解决方案,我可以按任何要求的顺序执行此操作
  • @Jelmerd 它是按字典顺序排列的。我已经用你想要的东西编辑了我的答案。你可以对第二层做同样的事情。
  • 谢谢,虽然还不太清楚我将如何对底层进行排序,例如,我希望底层为 EFCBADCBAD,我可以通过这个顺序的列表底层?
  • @Jelmerd 没问题,如果答案有帮助,您也可以投票。谢谢!
猜你喜欢
  • 2020-07-22
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2020-06-21
  • 2019-12-20
  • 2021-08-10
  • 2015-07-12
  • 2020-04-16
相关资源
最近更新 更多