2013-05-20 9 views
22

Gibt es eine Möglichkeit, auf einer einzigen Ebene eines MultiIndex zusammenzuführen, ohne den Index zurückzusetzen?Zusammenführen auf einer Ebene von MultiIndex

Ich habe eine "statische" Tabelle von zeitinvarianten Werten, indiziert durch eine ObjectID, und ich habe eine "dynamische" Tabelle von zeitlich veränderlichen Feldern, indiziert von ObjectID + Date. Ich möchte diese Tische zusammen verbinden.

Gerade jetzt, das Beste, was ich denken kann ist:

dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True) 

jedoch die dynamische Tabelle sehr groß ist, und ich will nicht mit seinem Index um Dreck haben, um das zu kombinieren Werte.

+0

Was passiert, wenn Sie eine zusätzliche Spalte mit der Ebene des Multiindex Sie anschließen möchten, erstellt und dann verschmolzen/verknüpften an, dass auf? Vielleicht nicht ganz effizient, aber zumindest behalten Sie den Index. –

+0

Ja, das würde funktionieren. Es würde etwas Speicher kosten, und es würde Geschwindigkeit nicht helfen. Zu diesem Zeitpunkt denke ich jedoch, dass ich den Index vollständig löschen kann, wenn er nicht dazu beitragen wird, die Verschmelzung zu beschleunigen. –

+2

Entsprechendes GitHub-Problem https://github.com/pydata/pandas/issues/3662 –

Antwort

9

Ja enthalten, da Pandas 0.14.0, ist es nun möglich ist, eine einzeln zu fusionieren -indizierter Datenrahmen mit einer Ebene eines mehrfach indizierten Datenrahmens unter Verwendung von .join.

df1.join(df2, how='inner') # how='outer' keeps all records from both data frames 

The 0.14 pandas docs beschreibt dies als gleichwertig, aber mehr Speicher effizienter und schneller als:

merge(df1.reset_index(), 
     df2.reset_index(), 
     on=['index1'], 
     how='inner' 
    ).set_index(['index1','index2']) 

Die docs auch erwähnen, dass .join nicht auf einer einzigen Ebene zu verschmelzen zwei multiindexed Datenrahmen verwendet werden, und von der GitHub Tracker-Diskussion für das vorherige Problem, es scheint, wie dies möglicherweise nicht von Priorität zu implementieren:

so habe ich in der einzelnen Join, siehe # 6363 zusammengeführt ; zusammen mit einigen Dokumenten auf , wie Sie eine Multi-Multi-Join tun. THat ist ziemlich kompliziert, um tatsächlich implementieren. und IMHO nicht die Mühe wert, wie es wirklich nicht ändert die Speicherauslastung/Geschwindigkeit so viel überhaupt.

Es gibt jedoch eine GitHub Konversation in Bezug auf diese, wo es einige jüngste Entwicklung gab https://github.com/pydata/pandas/issues/6360. Es ist auch möglich, dies zu erreichen, indem die Indizes, wie zuvor erwähnt und in den Dokumenten beschrieben, zurückgesetzt werden.

+1

Wie wählen Sie für das erste Beispiel die Stufe des MultiIndex für die Verknüpfung aus? –

+1

nvm, die [docs] (http://pandas.pydata.org/pandas-docs/stable/merging.html#joining-a-single-index-to-a-multi-index) sagen, dass es sich auf Joins bezieht der Index-Level hat den gleichen Namen wie der Single-Level-Index. –

+0

Und Joins sind extrem schnell in Pandas –

2

Ich komme um dies durch Neuindizierung der Datenrahmenverschmelzung, um den vollständigen Multiindex zu haben, so dass eine Linksbindung möglich ist.

# Create the left data frame 
import pandas as pd 
idx = pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[0,0,1,1],[0,1,0,1]], names=['lvl1','lvl2']) 
df = pd.DataFrame([1,2,3,4],index=idx,columns=['data']) 

#Create the factor to join to the data 'left data frame' 
newFactor = pd.DataFrame(['fact:'+str(x) for x in df.index.levels[0]], index=df.index.levels[0], columns=['newFactor']) 

Sie auf den Subindex der Verbindung der newFactor Datenrahmen von reindexing den Index des linken Datenrahmen

df.join(newFactor.reindex(df.index,level=0)) 
1

würde ich Mapping für eine einzelne Spalte verwenden:

df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x]) 
Verwandte Themen