2013-07-06 6 views
2

У меня проблемы с MultiIndex и stack(). Следующий пример основан на solution from Calvin Cheung на StackOvervlow.проблемы с MultiIndex

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

Так что мой вопрос, как я могу структурировать мультииндексный таким образом, что позволяет дубликаты в подуровнях?

+0

Индексы (включая MultiIndexes) должны быть уникальными. Подумайте об этом, как об индексе, все элементы - это кортежи. Это нормально, если один уровень не является единственным, но весь набор элементов MultiIndex для определенной строки должен быть уникальным для этой строки. Я думаю, вам нужно переосмыслить свою структуру. Почему вы хотите, чтобы эти значения были индексами, а не только значениями столбцов? – BrenBarn

+0

Хорошо, я соглашусь, что мне нужно переосмыслить MultiIndexes. Я надеялся на то, что было как интуитивно понятным, так и легким для написания фрагментов. Но я снова посмотрю на это, а также посмотрю, смогу ли я улучшить документацию. – highpost

ответ

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 

* Вы на самом деле не делает стержень здесь так или иначе, это просто происходит работать в вышеуказанном дело.

+0

Вы можете сделать это, но, как описано [здесь] (http://pandas.pydata.org/pandas-docs/dev/dsintro.html#series), это может вызвать исключение позже, если вы попытаетесь сделать что-то, что требует уникальный индекс. Также, как описано в [этом вопросе] (http://stackoverflow.com/questions/16626058/do-non-unique-indexes-provide-any-performance-advantage-in-pandas), вы можете пострадать от удара по производительности. – BrenBarn

Смежные вопросы