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 

  • Python - Input enthält NaN, Unendlichkeit oder einen zu großen Wert für dtype ('float64')
  • Wählen Sie nur numerische Felder aus, die Floats aus pandas dataframe enthalten
  • Pandas interpolieren Daten mit Einheiten
  • Pandas read_csv füllt leere Werte mit String 'nan', anstatt das Datum zu parsen
  • Dallr fasst das Äquivalent in Pandas zusammen
  • Max und Min Datum in Pandas Groupby
  • 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.