2016-03-29 47 views
1

我試圖加入兩個熊貓數據框;左邊的,有一個多重索引,右邊的只是一個普通的香草數據框。我想加入左邊數據框其中一個層面的正確數據框的索引。例如,如果我們有如下的例子:加入/合併兩個熊貓數據框。匹配其中一個指數的水平

  Age 
Boys   
     Sam 21 
     John 22 
Girls   
     Lisa 23 

 Points 
John  1 
Lisa  2 
Sam  3 

我想用這個來結束:

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

我已經算出來的方法如下,我只是想知道是否有更直接的方式

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 

我都那麼寫這個循環,其通過給它一個多指標「轉換」正確的數據框和值適當地重新排列

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 

我現在就可以加入他們的行列

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

回答

2

名稱的指標 - 這將有助於大熊貓,瞭解如何加入您的數據幀:

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' 

加入,現在可以很容易的:

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 NaN的 - 是你的空行

+0

的結果是相當整潔!許多thnx – Aenaon

相關問題