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 

  • Hyperlink zum Excel-Blatt hinzufügen, das von pandas dataframe to_excel erstellt wurde
  • Erstellen Sie eine aufsteigende Reihe von Ganzzahlen nach Gruppe in Pandas
  • Pandas zählen Frequenzen innerhalb der Str-Serie
  • Pandas to_csv mit quoting = 3 (QUOTE_NONNUMERIC) funktioniert nicht
  • Schnellste Weg durch ein Pandas-Dataframe zu iterieren?
  • Pandas bedingte Erstellung einer Serie / Dataframe-Spalte
  • 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.