Skip to main content
 首页 » 编程设计

python之MultiIndex 的问题

2025年05月04日10飞鱼

我在使用 MultiIndex 和 stack() 时遇到问题。以下示例基于 solution from 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:索引包含重复条目,无法 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?

请您参考如下方法:

而不是做 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 

*无论如何,您实际上并没有在此处进行转换,它恰好适用于上述情况。