2

我在使用 MultiIndex 和 stack() 时遇到问题。以下示例基于Calvin Cheung在 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 在 A 行的组中不再是唯一的,我们会收到错误消息:“pandas.core.reshape.ReshapeError: Index contains duplicate entries, cannot reshape” .

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

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

4

1 回答 1

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

*无论如何,您并没有真正在这里做一个支点,它恰好在上述情况下起作用。

于 2013-07-06T07:49:46.003 回答