2015-09-07 5 views
6

Ich versuche, mehrere Pandas DataFrames zu verketten, von denen einige Multi-Indizierung verwenden und andere einzelne Indizes verwenden. Als Beispiel nehmen wir die folgenden einzelnen indexierten Datenrahmen betrachten:So kombinieren Sie Einzel- und Multiindex Pandas DataFrames

> import pandas as pd 
> df1 = pd.DataFrame({'single': [10,11,12]}) 
> df1 

    single 
0  10 
1  11 
2  12 

Zusammen mit einem Multiindex Datenrahmen:

> level_dict = {} 
> level_dict[('level 1','a','h')] = [1,2,3] 
> level_dict[('level 1','b','j')] = [5,6,7] 
> level_dict[('level 2','c','k')] = [10, 11, 12] 
> level_dict[('level 2','d','l')] = [20, 21, 22] 
> df2 = pd.DataFrame(level_dict) 
> df2 

    level 1 level 2  
     a b  c d 
     h j  k l 
0  1 5  10 20 
1  2 6  11 21 
2  3 7  12 22 

Jetzt habe ich die beiden Datenrahmen verketten möchten. Wenn ich versuche, concat zu verwenden flacht den Multiindex wie folgt:

> df3 = pd.concat([df2,df1], axis=1) 
> df3 

    (level 1, a, h) (level 1, b, j) (level 2, c, k) (level 2, d, l)  single 
0    1    5    10    20   10 
1    2    6    11    21   11 
2    3    7    12    22   12 

Wenn ich stattdessen eine einzelne Spalte zum Multiindex Datenrahmen anhängen df2 wie folgt:

> df2['single'] = [10,11,12] 
> df2 

    level 1 level 2  single 
     a b  c d  
     h j  k l  
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 

Wie kann ich diese Datenrahmen stattdessen erzeugen aus df1 und df2 mit concat, merge oder join?

Antwort

2

Ich glaube nicht, dass Sie vermeiden können, den einzelnen Index in MultiIndex umzuwandeln. Dies ist wahrscheinlich der einfachste Weg, den Sie nach dem Beitritt auch konvertieren können.

In [48]: df1.columns = pd.MultiIndex.from_tuples([(c, '', '') for c in df1]) 

In [49]: pd.concat([df2, df1], axis=1) 
Out[49]: 
    level 1 level 2  single 
     a b  c d  
     h j  k l  
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 
+0

Vielen Dank @chrisb! Ich hatte auf einen einfacheren, verallgemeinerbaren Ansatz gehofft, aber ich konnte hier einen Workaround mit Ihrer Lösung formulieren, der meinen Anforderungen entspricht – wbinventor

1

Wenn Sie nur eine Spalte anhängen könnten Sie df1 Zugriff im Wesentlichen als eine Serie:

df2[df1.columns[0]] = df1.iloc[:, 0] 
df2 
    level 1 level 2  single 
     a b  c d 
     h j  k l 
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 

Wenn Sie nur eine Reihe in erster Linie gemacht haben könnte es ein wenig leichter sein würde, lesen. Dieser Befehl würde das gleiche tun:

ser1 = df1.iloc[:, 0] # make df1's column into a series 
df2[ser1.name] = ser1 
Verwandte Themen