Pandas schlurfen auf einer bestimmten Ebene

Ich habe einen Pandas DataFrame mit einem MultiIndex auf den Zeilen:

 index = pandas.MultiIndex.from_tuples(list(itertools.product(range(3), range(3)))) df = pandas.DataFrame(numpy.random.randn(9,3), index=index, columns=['A', 'B', 'C']) ABC 0 0 2.400417 0.698638 1.231540 1 -0.023154 -2.110450 0.774964 2 -1.282392 -0.062794 1.471655 1 0 -1.081853 0.261876 -1.771075 1 -2.013747 -0.377957 -0.393802 2 1.711172 -0.552468 1.018727 2 0 0.155821 -0.222691 0.496586 1 0.563638 -0.756709 1.050212 2 -1.446159 -0.891549 0.256695 

Ich möchte diese DataFrame auf der ersten Ebene des Index mischen, also ein mögliches Ergebnis wäre:

  ABC 1 0 -1.081853 0.261876 -1.771075 1 -2.013747 -0.377957 -0.393802 2 1.711172 -0.552468 1.018727 0 0 2.400417 0.698638 1.231540 1 -0.023154 -2.110450 0.774964 2 -1.282392 -0.062794 1.471655 2 0 0.155821 -0.222691 0.496586 1 0.563638 -0.756709 1.050212 2 -1.446159 -0.891549 0.256695 

  • Überlagern von mehreren Histogrammen mit Pandas
  • Wie konvertiere man ein pandas / dataframe zu XML?
  • Zählen Sie, ob: Job in einem bestimmten Zeitintervall ist
  • Füge Pandas-Dataframe pünktlich und eine weitere Spalte hinzu
  • Wie man eine Hitzewap von pandas DataFrame aufgibt
  • Entfernen von duplizierten Zeilen, aber halten die mit einem bestimmten Wert in einer Spalte (Pandas Python)
  • 2 Solutions collect form web for “Pandas schlurfen auf einer bestimmten Ebene”

    Die reindex Methode kann dies erreichen, wenn ein nachgeordnetes Array von Tupeln übergeben wird, die mit der gewünschten Reihenfolge übereinstimmen. An welchem ​​Punkt kann die Neuordnung als am besten für Ihr Problem erfolgen. Beispielsweise:

     In [38]: df Out[38]: ABC 0 0 -1.725337 0.111493 0.178294 1 -1.809003 -0.614219 -0.931909 2 0.621427 -0.186233 0.254727 1 0 -1.322863 1.242415 1.375579 1 0.249738 -1.280204 0.356491 2 -0.743671 0.325841 -0.167772 2 0 -0.070937 0.401172 -1.790801 1 1.433794 2.257198 1.848435 2 -1.021557 -1.054363 -1.485536 In [39]: neworder = [1, 0, 2] In [41]: newindex = sorted(df.index, key=lambda x: neworder.index(x[0])) In [42]: newindex Out[42]: [(1L, 0L), (1L, 1L), (1L, 2L), (0L, 0L), (0L, 1L), (0L, 2L), (2L, 0L), (2L, 1L), (2L, 2L)] In [43]: df.reindex(newindex) Out[43]: ABC 1 0 -1.322863 1.242415 1.375579 1 0.249738 -1.280204 0.356491 2 -0.743671 0.325841 -0.167772 0 0 -1.725337 0.111493 0.178294 1 -1.809003 -0.614219 -0.931909 2 0.621427 -0.186233 0.254727 2 0 -0.070937 0.401172 -1.790801 1 1.433794 2.257198 1.848435 2 -1.021557 -1.054363 -1.485536 

    Es wäre viel einfacher, wenn das folgende funktioniert, aber nein :

     df.ix[[1, 0, 2]] 

    Das Folgende ist eher ein Workaround. Vielleicht gibt es einen besseren Weg, aber ich konnte es nicht herausfinden. Dies schafft nur eine Liste von DataFrame 'Slices' in der richtigen Reihenfolge und verkettet sie mit pandas.concat .

     In : df Out: ABC 0 0 1.202098 -0.031121 1.417629 1 -0.895862 0.697531 -0.572411 2 1.179101 -0.008602 1.583385 1 0 1.969477 -0.968004 -0.567695 1 -1.504443 -0.002264 -0.413091 2 -1.412457 0.310518 0.267475 2 0 -0.385933 -0.471800 -0.598141 1 -0.105032 0.443437 -0.615566 2 -1.035326 -0.282289 -0.042762 In : shuffled = [2,0,1] In : df2 = pandas.concat([df.ix[i:i] for i in shuffled]) In : df2 Out: ABC 2 0 -0.385933 -0.471800 -0.598141 1 -0.105032 0.443437 -0.615566 2 -1.035326 -0.282289 -0.042762 0 0 1.202098 -0.031121 1.417629 1 -0.895862 0.697531 -0.572411 2 1.179101 -0.008602 1.583385 1 0 1.969477 -0.968004 -0.567695 1 -1.504443 -0.002264 -0.413091 2 -1.412457 0.310518 0.267475 
    Python ist die beste Programmiersprache der Welt.