2017-10-03 8 views
5

J'ai vu plusieurs articles à ce sujet mais je n'arrivais pas à comprendre comment fusionner, joindre et concat. Comment puis-je fusionner deux dataframes pour trouver des index correspondants?Fusionner deux dataframes avec multi-index

en:

import pandas as pd 
import numpy as np 
row_x1 = ['a1','b1','c1'] 
row_x2 = ['a2','b2','c2'] 
row_x3 = ['a3','b3','c3'] 
row_x4 = ['a4','b4','c4'] 
index_arrays = [np.array(['first', 'first', 'second', 'second']), np.array(['one','two','one','two'])] 
df1 = pd.DataFrame([row_x1,row_x2,row_x3,row_x4], columns=list('ABC'), index=index_arrays) 
print(df1) 

out:

   A B C 
first one a1 b1 c1 
     two a2 b2 c2 
second one a3 b3 c3 
     two a4 b4 c4 

en:

row_y1 = ['d1','e1','f1'] 
row_y2 = ['d2','e2','f2'] 
df2 = pd.DataFrame([row_y1,row_y2], columns=list('DEF'), index=['first','second']) 
print(df2) 

sur

  D E F 
first d1 e1 f1 
second d2 e2 f2 

dans d'autres mots, comment puis-je les fusionner pour atteindre df3 (comme suit)?

dans

row_x1 = ['a1','b1','c1'] 
row_x2 = ['a2','b2','c2'] 
row_x3 = ['a3','b3','c3'] 
row_x4 = ['a4','b4','c4'] 
row_y1 = ['d1','e1','f1'] 
row_y2 = ['d2','e2','f2'] 

row_z1 = row_x1 + row_y1 
row_z2 = row_x2 + row_y1 
row_z3 = row_x3 + row_y2 
row_z4 = row_x4 + row_y2 

df3 = pd.DataFrame([row_z1,row_z2,row_z3,row_z4], columns=list('ABCDEF'), index=index_arrays) 
print(df3) 

sur

   A B C D E F 
first one a1 b1 c1 d1 e1 f1 
     two a2 b2 c2 d1 e1 f1 
second one a3 b3 c3 d2 e2 f2 
     two a4 b4 c4 d2 e2 f2 

Répondre

6

Option 1
utilisation pd.DataFrame.reindex + pd.DataFrame.join
reindex a un paramètre level pratique qui vous permet d'étendre sur les niveaux d'index ne sont pas présents.

df1.join(df2.reindex(df1.index, level=0)) 

      A B C D E F 
first one a1 b1 c1 d1 e1 f1 
     two a2 b2 c2 d1 e1 f1 
second one a3 b3 c3 d2 e2 f2 
     two a4 b4 c4 d2 e2 f2 

Option 2
Vous pouvez renommer vos axes et join travaillerez

df1.rename_axis(['a', 'b']).join(df2.rename_axis('a')) 

      A B C D E F 
a  b       
first one a1 b1 c1 d1 e1 f1 
     two a2 b2 c2 d1 e1 f1 
second one a3 b3 c3 d2 e2 f2 
     two a4 b4 c4 d2 e2 f2 

Vous pouvez suivre cela avec un autre rename_axis pour obtenir les résultats souhaités

df1.rename_axis(['a', 'b']).join(df2.rename_axis('a')).rename_axis([None, None]) 

      A B C D E F 
first one a1 b1 c1 d1 e1 f1 
     two a2 b2 c2 d1 e1 f1 
second one a3 b3 c3 d2 e2 f2 
     two a4 b4 c4 d2 e2 f2