MultiIndex的问题

时间:2013-07-06 01:07:22

标签: python pandas

我遇到MultiIndex和stack()的问题。以下示例基于StackOvervlow上的solution from Calvin Cheung

=== 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在A行组中不再是唯一的,我们会收到一条错误消息:“pandas.core.reshape.ReshapeError:索引包含重复的条目,无法重新形成”

我期望子索引的形状表现得像主索引的形状,其中重复项在第一行条目下用空白条目表示。

=== 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

所以我的问题是,如何以允许子级别重复的方式构建MultiIndex?

1 个答案:

答案 0 :(得分:1)

而不是pivot *,而是直接set_index(这适用于两个示例):

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

*无论如何,你并没有真正在这里工作,它恰好适用于上述情况。