2016-05-27 7 views
1

Angesichts eines DataFrame (d) mit MultiIndex-Spalten, würde ich gerne einen anderen DataFrame (d2) als eine der "multicolumns", so dass die oberste Ebene hat einige Label und auf der zweiten Ebene Etiketten denen des Originals übereinstimmen:Methode zum Setzen neuer Multiindex-Spalten aus verschiedenen Datenrahmen

nr.seed(0) 
abc = ['a', 'b', 'c'] 
mi = pd.MultiIndex.from_product([['A'], abc]) 
d = DataFrame(np.random.randint(0, 10, (4, 3)), columns=mi) 
d 
    A  
    a b c 
0 5 0 3 
1 3 7 9 
2 3 5 2 
3 4 7 6 

d2 = DataFrame(np.random.randint(0, 10, (4, 3)), columns=abc) 
d2 
    a b c 
0 8 8 1 
1 6 7 7 
2 8 1 5 
3 9 8 9 

Wenn möglich, würde Ich mag sie verbinden, um eine einzelne eingebaute Methode, die die folgende forloop erreicht:

for c2 in d2: 
    d['B', c2] = d2[c2] 
d 
    A  B  
    a b c a b c 
0 5 0 3 8 8 1 
1 3 7 9 6 7 7 
2 3 5 2 8 1 5 
3 4 7 6 9 8 9 

Für einen Datenrahmen mit einem einzigen -Niveau Säule:

d3 = d.copy() 
d3.columns = d3.columns.droplevel(0) 
d3 = d3.rename(columns=dict(zip('abc', 'def'))) 
d3 
    d e f 
0 5 0 3 
1 3 7 9 
2 3 5 2 
3 4 7 6 

ich folgende Möglichkeiten:

d3[d2.columns] = d2 
d3 
    d e f a b c 
0 5 0 3 8 8 1 
1 3 7 9 6 7 7 
2 3 5 2 8 1 5 
3 4 7 6 9 8 9 

Aber wenn ich versuche, diese mit dem MultiIndexed Datenrahmen, bekomme ich Fehler:

d['B', tuple(d2.columns)] = d2 
=> ValueError: Wrong number of items passed 3, placement implies 1 
d['B'][tuple(d2.columns)] = d2 
=> KeyError: 'B' 

Gibt es eine eingebaute Methode zu tun Dies? (Grundsätzlich this für mehrere Spalten gleichzeitig).

Antwort

1

UPDATE:

def add_multicolumn(df, df2, new_col_name): 
    tmp = df2.copy() # make copy, otherwise df2 will be changed !!! 
    tmp.columns = pd.MultiIndex.from_product([[new_col_name], df2.columns.tolist()]) 
    return pd.concat([df, tmp], axis=1) 

davon aus, dass wir die folgenden DF haben, und wir wollen ein drittes 'mehrspaltigen' hinzuzufügen - C:

In [114]: d 
Out[114]: 
    A  B 
    a b c a b c 
0 5 5 7 0 7 2 
1 5 3 9 0 5 5 
2 5 8 5 5 5 7 
3 5 4 5 4 5 2 

unsere Funktion:

In [132]: add_multicolumn(d, d2, 'C') 
Out[132]: 
    A  B  C 
    a b c a b c a b c 
0 5 5 7 0 7 2 0 7 2 
1 5 3 9 0 5 5 0 5 5 
2 5 8 5 5 5 7 5 5 7 
3 5 4 5 4 5 2 4 5 2 

OLD Antwort:

Sie es pd.concat() verwenden können:

In [35]: d = pd.concat({'A':d['A'], 'B':d2}, axis=1) 

In [36]: d 
Out[36]: 
    A  B 
    a b c a b c 
0 7 3 9 0 7 2 
1 9 4 5 0 5 5 
2 7 6 1 5 5 7 
3 2 5 7 4 5 2 

Erläuterung:

In [37]: d['A'] 
Out[37]: 
    a b c 
0 7 3 9 
1 9 4 5 
2 7 6 1 
3 2 5 7 

In [40]: pd.concat({'A':d['A'], 'B':d2}, axis=1) 
Out[40]: 
    A  B 
    a b c a b c 
0 5 5 7 0 7 2 
1 5 3 9 0 5 5 
2 5 8 5 5 5 7 
3 5 4 5 4 5 2 
+0

Nizza, sieht wie folgt aus arbeiten kann. Irgendeine Idee, wenn es eine DataFrame-Methode gibt, die das kann (wie 'd.some_set_method ('B', d2)')? – beardc

+0

@beardc, ich habe meine Antwort aktualisiert - bitte überprüfen Sie – MaxU

+0

Eigentlich bevorzuge ich die alte Antwort, da es nicht die zusätzliche Funktion schreiben erfordert. Ich wollte fragen, ob es bereits eine eingebaute Methode für den DataFrame gibt, da sie heutzutage eine Menge Funktionalität für eingebaute Methoden zu haben scheint. – beardc