2016-08-01 4 views
0

I erzeugen einen leeren Datenrahmen wie folgt:Pandas: Set mehrere MultiColumns als Multiindex

topFields = ['desc', 'desc', 'price', 'price', 'units', 'units'] 
bottomFields = ['foo', 'bar', 'mean', 'mom_2', 'mean', 'mom_2'] 
resultsDf = pd.DataFrame(columns=pd.MultiIndex.from_arrays([topFields, bottomFields])) 

Nun würde Ich mag die ersten beiden Spalten setzen (mit desc als Top-Level-Wert) als Index (und als eine allgemeine Herausforderung, alle Spalten mit desc als Top-Level-Wert). Ich habe mehrere Möglichkeiten ausprobiert, von denen keine funktionieren.

Hier ist die intuitivste (Ausfall):

>>> test = resultsDf.set_index('desc') 
>>> test 
Out[4]: 
Empty DataFrame 
Columns: [(price, mean), (price, mom_2), (units, mean), (units, mom_2)] 
Index: [] 
>>> test.index 
Out[5]: Index([], dtype='object', name='desc') 

pandas korrekt beide desc Spalten entfernt (von "Spalten"), aber keiner von ihnen im Index erscheinen. Stattdessen habe ich nur ein Feld im Index. Wenn ich versuche, eine Zeile zu erstellen, basierend auf einem Multiindex, bekomme ich einen Fehler:

>>> test.loc[pd.IndexSlice[0, 0], :] = 1 
Traceback (most recent call last): 
[...] 
KeyError: '[0 0] not in index' 

Antwort

1

Es ist wie Notwendigkeit sieht set_index durch Tupel:

test = resultsDf.set_index(('desc', 'foo')) 
print (test) 
Empty DataFrame 
Columns: [(desc, bar), (price, mean), (price, mom_2), (units, mean), (units, mom_2)] 
Index: [] 

print (test.index) 
Index([], dtype='object', name=('desc', 'foo')) 

Oder vielleicht:

test = resultsDf.set_index([('desc', 'foo'), ('desc', 'bar')]) 
print (test) 
Columns: [(price, mean), (price, mom_2), (units, mean), (units, mom_2)] 
Index: [] 

print (test.index) 
MultiIndex(levels=[[], []], 
      labels=[[], []], 
      names=[('desc', 'foo'), ('desc', 'bar')]) 
+0

Was würde wäre die generische Lösung, wenn ich viele 'desc'-Spalten hätte und sie alle als Index setzen wollte? – FooBar

+0

Eine mögliche Lösung kann Tupel generieren, aber es ist wirklich schwierig, eine gute allgemeine Lösung zu machen. – jezrael