2016-03-29 7 views
1

Ich versuche, zwei Pandas Datenrahmen zu verbinden; Der linke hat einen Multiindex und der rechte ist nur ein einfacher Datenrahmen. Ich möchte dem Index des rechten Datenrahmens auf einer der Ebenen des linken Datenrahmens beitreten. Zum Beispiel, wenn wir das folgende Beispiel:Verbinden/Zusammenführen von zwei Pandas-Datenrahmen. Match die Ebenen von eins mit dem Index der anderen

  Age 
Boys   
     Sam 21 
     John 22 
Girls   
     Lisa 23 

und

 Points 
John  1 
Lisa  2 
Sam  3 

Ich möchte mit diesem am Ende:

  Age Points 
Boys     
     Sam 21  3 
     John 22  1 
Girls     
     Lisa 23  2 

So wie ich es gearbeitet haben, ist wie folgt aufgeteilt Ich frage mich nur, ob es einen einfacheren Weg gibt

In[2]: import pandas as pd 
In[3]: idx = pd.MultiIndex(levels=[['Boys', 'Girls', ''],['Sam', 'John', 'Lisa', '']], labels=[[0,2,2,1,2],[3,0,1,3,2]]) 
df1 = pd.DataFrame({'Age':['',21,22,'',23]}, index=idx) 
df2 = pd.DataFrame({'Points':[1, 2, 3]}, index=['John','Lisa','Sam']) 

In[4]: df1 
Out[4]: 
      Age 
Boys   
     Sam 21 
     John 22 
Girls   
     Lisa 23 

In[5]: df2 
Out[5]: 
     Points 
John  1 
Lisa  2 
Sam  3 

Ich habe dann diese Schleife geschrieben, indem es einen Multi-Index den richtigen Datenrahmen „transformiert“ und die Werte neu geordnet entsprechend

lvl = df1.index.levels[1] 
lbl = df1.index.labels[1] 
y = df2.iloc[:,0].values.tolist() 
z=[] 
for x in [lvl[k] for k in lbl]: 
    try: 
     idx = df2.index.tolist().index(x) 
    except ValueError as e: 
     z.append('') 
    else: 
     z.append(y[idx]) 

temp=pd.DataFrame(index=df1.index) 
temp['Points'] = z 

ich sie jetzt

out = df1.join(temp) 
out 
Out[6]: 
      Age Points 
Boys     
     Sam 21  3 
     John 22  1 
Girls     
     Lisa 23  2 

Antwort

2

Namen Ihre Indizes beitreten kann - es wird Pandas helfen zu verstehen, wie Ihre Datenrahmen verbinden:

In [72]: df1 
Out[72]: 
      Age 
sex name 
Boys 
     Sam 21 
     John 22 
Girls 
     Lisa 23 

In [73]: df1.index.names=['sex','name'] 

In [74]: df2.index.name = 'name' 

kann ziemlich einfach jetzt Joining sein:

In [75]: df1.join(df2) 
Out[75]: 
      Age Points 
sex name 
Boys    NaN 
     Sam 21  3 
     John 22  1 
Girls    NaN 
     Lisa 23  2 

PS NaNs - sind aufgrund Ihrer leeren Zeilen

+0

, die recht ordentlich ist! Vielen Dank – Aenaon

Verwandte Themen