Wie man sich mit einem mehrdimensionalen index in pandas
In Pandas, was ist ein guter Weg, um wählen Sie Sätze von beliebigen Zeilen in ein multiindex?
df = pd.DataFrame(columns=['A', 'B', 'C'])
df['A'] = ['a', 'a', 'b', 'b']
df['B'] = [1,2,3,4]
df['C'] = [1,2,3,4]
the_indices_we_want = df.ix[[0,3],['A','B']]
df = df.set_index(['A', 'B']) #Create a multiindex
df.ix[the_indices_we_want] #ValueError: Cannot index with multidimensional key
df.ix[[tuple(x) for x in the_indices_we_want.values]]
Diese Letzte Zeile ist eine Antwort, aber es fühlt sich klobig Antwort; Sie kann nicht einmal Listen, Tupeln. Es beinhaltet auch die Erzeugung eines neuen Objekts zu tun, die Indizierung mit. Ich bin in einer situation, wo ich versuche zu tun, eine Suche auf ein multiindex dataframe, mit Indizes von einem anderen dataframe:
data_we_want = dataframe_with_the_data.ix[dataframe_with_the_indices[['Index1','Index2']]]
Recht, jetzt sieht es aus wie ich brauche, es zu schreiben, wie diese:
data_we_want = dataframe_with_the_data.ix[[tuple(x) for x in dataframe_with_the_indices[['Index1','Index2']].values]]
Dass ist praktikabel, aber wenn es viele Zeilen gibt (d.h. Hunderte von Millionen von gewünschten Indizes), dann generieren diese Liste von Tupeln wird ganz die Belastung. Alle Lösungen?
Edit: Die Lösung von @joris funktioniert, aber nicht, wenn die Indizes sind alle zahlen. Beispiel, wo die Indizes sind alle ganzen zahlen:
df = pd.DataFrame(columns=['A', 'B', 'C'])
df['A'] = ['a', 'a', 'b', 'b']
df['B'] = [1,2,3,4]
df['C'] = [1,2,3,4]
the_indices_we_want = df.ix[[0,3],['B','C']]
df = df.set_index(['B', 'C'])
df.ix[pd.Index(the_indices_we_want)] #ValueError: Cannot index with multidimensional key
df.ix[pd.Index(the_indices_we_want.astype('object'))] #Works, though feels clunky.
InformationsquelleAutor jeffalstott | 2015-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du tatsächlich nicht von der index mit einem DataFrame direkt, aber wenn Sie es konvertieren zu einem Index-Objekt, es hat die richtige Sache (eine Zeile in der DataFrame wird als ein multi-index-Eintrag):
Dies ist ein etwas sauberer. Und mit einigen schnellen tests scheint es ein bisschen schneller (aber nicht viel, nur 2-mal)
InformationsquelleAutor joris
In neueren Versionen von pandas können Sie einfach verwenden .iloc für Zeile Indizierung.
InformationsquelleAutor bjonen