Python 多索引问题

Python 多索引问题,python,pandas,Python,Pandas,我在使用MultiIndex和stack()时遇到问题。以下示例基于StackOvervlow上的 === multi.csv === h1,main,h3,sub,h5 a,A,1,A1,1 b,B,2,B1,2 c,B,3,A1,3 d,A,4,B2,4 e,A,5,B3,5 f,B,6,A2,6 === multi.py === #!/usr/bin/env python import pandas as pd df1 = pd.read_cs

我在使用MultiIndex和stack()时遇到问题。以下示例基于StackOvervlow上的

=== multi.csv ===
  h1,main,h3,sub,h5
  a,A,1,A1,1
  b,B,2,B1,2
  c,B,3,A1,3
  d,A,4,B2,4
  e,A,5,B3,5
  f,B,6,A2,6

=== multi.py ===
  #!/usr/bin/env python

  import pandas as pd

  df1 = pd.read_csv('multi.csv')
  df2 = df1.pivot('main', 'sub').stack()
  print(df2)

=== output ===
           h1  h3  h5
  main sub
  A    A1   a   1   1
       B2   d   4   4
       B3   e   5   5
  B    A1   c   3   3
       A2   f   6   6
       B1   b   2   2
只要子列中的条目相对于主列中的相应条目是唯一的,这一点就有效。但是,如果我们将行e中的子列条目更改为B2,那么B2在行组中不再是唯一的,我们会收到一条错误消息:“pandas.core.reformate.reformateError:索引包含重复条目,无法重新整形”

我希望子索引的形状与主索引的形状类似,在主索引中,重复项在第一行条目下用空白条目表示

=== expected output ===
           h1  h3  h5
  main sub
  A    A1   a   1   1
       B2   d   4   4
            e   5   5
  B    A1   c   3   3
       A2   f   6   6
       B1   b   2   2
因此,我的问题是,如何以允许在子级别中重复的方式构造多索引?

而不是直接执行a*(这两个示例都适用):


*不管怎么说,这里并不是真正的轴心,它只是碰巧在上述情况下起作用。

索引(包括多索引)应该是唯一的。把它想象成一个索引,整个元素都是元组。如果一个级别是非唯一的,也可以,但是特定行的整个多索引元素集必须是该行的唯一元素。我认为你需要重新考虑你的结构。为什么要将这些值作为索引而不仅仅是列值?好的,我同意我需要重新考虑多重索引。我希望能有一种既直观易读又容易写的东西。但我会再看一遍,看看是否可以改进文档。您可以这样做,但如前所述,如果您尝试执行需要唯一索引的操作,可能会在以后引发异常。此外,如中所述,您可能会受到性能影响。
In [11]: df
Out[11]:
  h1 main  h3 sub  h5
0  a    A   1  A1   1
1  b    B   2  B1   2
2  c    B   3  A1   3
3  d    A   4  B2   4
4  e    A   5  B2   5
5  f    B   6  A2   6

In [12]: df.set_index(['main', 'sub'])
Out[12]:
         h1  h3  h5
main sub
A    A1   a   1   1
B    B1   b   2   2
     A1   c   3   3
A    B2   d   4   4
     B2   e   5   5
B    A2   f   6   6