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 

  • Split eine Pandas-Serie ohne Multiindex
  • Zurückgeben von mehreren Werten aus Pandas gelten auf einem DataFrame
  • Mit matplotlib colormap mit pandas dataframe.plot Funktion
  • Python: Pandas Serie - Warum nimm?
  • Konstruieren von 3D Pandas DataFrame
  • Python-Pandas: Wie man mehrere univariate Regression nach Gruppe durchführt
  • Wie man OLS von statsmodels auf groupby anwendet
  • Pandas Handelssignalspalten
  • 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.