2017-11-01 3 views
0

geformt Ich habe zwei identisch geformte Pandas Datenrahmen:Merge identisch Datenrahmen in einem Multiindex Datenrahmen

index = range(5) 
columns = ['A', 'B', 'C'] 
left = pd.DataFrame(np.random.randint(1,10, size=(5,3)), index=index, columns=columns) 
right = pd.DataFrame(np.random.randint(1,10, size=(5,3)), index=index, columns=columns) 

Nämlich

left 
Out[127]: 
    A B C 
0 3 4 7 
1 5 8 4 
2 8 8 7 
3 1 3 5 
4 3 5 8 

und

right 
Out[129]: 
    A B C 
0 2 8 2 
1 3 6 5 
2 4 6 4 
3 8 4 2 
4 4 2 9 

Nun würde Ich mag sie kombinieren, in ein einzelner Datenrahmen mit demselben Index und zwei Spaltenebenen. Auf den Oberseite der gemeinsamen Spaltennamen und auf der Unterseite des ursprünglichen Datenrahmen Namen:

combined = pd.DataFrame(np.nan, index=index, columns=pd.MultiIndex.from_tuples([('A', 'left'), ('A', 'right'), ('B', 'left'), ('B', 'right'), ('C', 'left'), ('C', 'right')])) 
for column in combined.columns: 
    if column[1] == 'left': 
     combined[column] = left[column[0]] 
    elif column[1] == 'right': 
     combined[column] = right[column[0]] 

combined 
Out[138]: 
    A   B   C  
    left right left right left right 
0 3  2 4  8 7  2 
1 5  3 8  6 4  5 
2 8  4 8  6 7  4 
3 1  8 3  4 5  2 
4 3  4 5  2 8  9 

Da der Datenrahmen Ich bin der Umgang mit massiver ist, gibt es einen schnellen oder eleganten Weg, um dies zu erreichen?

Vielen Dank im Voraus!

Antwort

2

Sie können Schlüssel Parameter in pd.concat bieten eine weitere Spalte Ebene hinzuzufügen:

pd.concat([left, right], axis=1, keys=['left', 'right']).swaplevel(axis=1).sort_index(axis=1) 

#  A   B   C  
# left right left right left right 
#0 9  7 3  4 4  2 
#1 8  3 9  1 3  5 
#2 3  6 1  6 5  7 
#3 9  1 7  2 2  2 
#4 9  5 3  1 4  3 
+2

Es kann das so einfach sein? Super – Dark

+0

Danke, es ist genau das, was ich gesucht habe! –

+0

Kühl. Schön, dass es für dich funktioniert! – Psidom

2

Wir Suffix hinzufügen können dann geteilt und es zu Multi Index konvertieren dh

ndf = pd.concat([left.add_suffix(' left'),right.add_suffix(' right')],1).sort_index(1) 
x = ndf.columns.str.split(' ') 
ndf.columns = pd.MultiIndex.from_arrays([x.str[0],x.str[1]]) 
 
    A   B   C  
    left right left right left right 
0 1  2 4  1 8  3 
1 3  5 9  8 2  7 
2 2  7 8  5 6  3 
3 2  2 3  9 5  6 
4 9  4 3  6 3  9 
+0

Danke! Ich entschied mich, die andere Antwort der Kürze zu akzeptieren, aber deine ist auch großartig. –

+0

Ja. Es ist die Präfekt-Antwort dort ist. Tue es. – Dark