2016-03-29 33 views
1

diziniyle eşleştirin İki panda veri kümesine katılmaya çalışıyorum; Soldaki, bir multi-endeksi vardır ve doğru olan sadece bir düz vanilya veri ağıdır. Sağ veri çerçevesinin indeksine sol veri çerçevesinin düzeylerinden birine katılmak istiyorum.İki Panda veri çerçevesini birleştirir/birleştirir. Birinin düzeylerini diğer

  Age 
Boys   
     Sam 21 
     John 22 
Girls   
     Lisa 23 

ve

 Points 
John  1 
Lisa  2 
Sam  3 

Ben bu ile bitirmek istiyorum: çözdüm çıkma yöntemi

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

şöyle Örneğin aşağıdaki örneği varsa Ben sadece daha basit bir yolu olup olmadığını merak ediyorum

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 

Ben sonra bir çok indeksi vererek doğru dataframe "dönüştüren" Bu döngü yazılı ve değerler uygun şimdi onlara

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

cevap

2

adı endeksleri katılabilir

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 

yeniden düzenlenmiş olması - Şimdi oldukça kolay olabilir katılma

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' 

: o veri çerçeveleri katılmak için nasıl anlamak için pandalar yardımcı olacaktır

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'ler - çok zarif Bu senin boş satırlar

+0

sonucudur! Çok thnx – Aenaon

İlgili konular