Pandas: Fügen Sie einem Datenrahmen mit mehreren Indexspalten eine Spalte hinzu

72

Ich möchte der zweiten Ebene eines Multiindex-Spaltendatenrahmens eine Spalte hinzufügen.

In [151]: df
Out[151]: 
first        bar                 baz           
second       one       two       one       two 
A       0.487880 -0.487661 -1.030176  0.100813 
B       0.267913  1.918923  0.132791  0.178503
C       1.550526 -0.312235 -1.177689 -0.081596 

Der übliche Trick der direkten Zuordnung funktioniert nicht:

In [152]: df['bar']['three'] = [0, 1, 2]

In [153]: df
Out[153]: 
first        bar                 baz           
second       one       two       one       two 
A       0.487880 -0.487661 -1.030176  0.100813
B       0.267913  1.918923  0.132791  0.178503
C       1.550526 -0.312235 -1.177689 -0.081596

Wie kann ich die dritte Zeile unter "Balken" hinzufügen?


quelle
2
Ich denke, das OP bedeutet, die dritte Spalte hinzuzufügen .
Qaswed

Antworten:

91

Es ist eigentlich ziemlich einfach (FWIW, ich dachte ursprünglich, es auf deine Weise zu machen):

df['bar', 'three'] = [0, 1, 2]
df = df.sort_index(axis=1)
print(df)

        bar                        baz          
        one       two  three       one       two
A -0.212901  0.503615      0 -1.660945  0.446778
B -0.803926 -0.417570      1 -0.336827  0.989343
C  3.400885 -0.214245      2  0.895745  1.011671
spencerlyon2
quelle
Vielen Dank. Ich muss sagen, es ist (für mich) absolut nicht offensichtlich, warum die neue Spalte erst nach Verwendung von sort_index angezeigt wird.
4
Oh, tut mir leid, das ist nicht Teil der Antwort, nur dass ich wählerisch bin. Es wird tatsächlich angezeigt, sobald Sie anrufen df['bar', 'three'] = [0, 1, 2]. Standardmäßig setzen Pandas es am Ende des DataFrame (nach [baz, two]). Ich wollte es nur mit den anderen sehen bar.
Spencerlyon2
Aha. Danke für die Erklärung.
1
Dadurch wird die neue Spalte "Drei" an die Untertabelle "Leiste" angehängt. Aber was ist, wenn Sie diese neue Spalte in die Untertabelle 'bar' einfügen (anstatt anhängen) möchten, z. B. 'drei' zwischen 'eins' und 'zwei' einfügen?
Joris Kinable
Die Reihenfolge der Spalten spielt hier keine Rolle. Wenn Sie sie neu anordnen wollte , damit sie angezeigt „ein, drei, zwei“ Sie könnten das tun , indem Sie in df.loc[:, XX]dem XXTupel ( „bar“, „Eins“) hat, ( „bar“, „drei“) usw.
spencerlyon2
14

Wenn wir eine mehrstufige Spalte hinzufügen möchten:

Quelle DF:

In [221]: df
Out[221]:
first        bar                 baz
second       one       two       one       two
A      -1.089798  2.053026  0.470218  1.440740
B       0.488875  0.428836  1.413451 -0.683677
C      -0.243064 -0.069446 -0.911166  0.478370

Option 1 : Hinzufügen des Teilungsergebnisses: bar / bazals neue fooSpalte

In [222]: df = df.join(df[['bar']].div(df['baz']).rename(columns={'bar':'foo'}))

In [223]: df
Out[223]:
first        bar                 baz                 foo
second       one       two       one       two       one       two
A      -1.089798  2.053026  0.470218  1.440740 -2.317647  1.424980
B       0.488875  0.428836  1.413451 -0.683677  0.345873 -0.627250
C      -0.243064 -0.069446 -0.911166  0.478370  0.266761 -0.145172

Option 2 : Hinzufügen einer mehrstufigen Spalte mit drei "Unterspalten":

In [235]: df = df.join(pd.DataFrame(np.random.rand(3,3),
     ...:                           columns=pd.MultiIndex.from_product([['new'], ['one','two','three']]),
     ...:                             index=df.index))

In [236]: df
Out[236]:
first        bar                 baz                 new
second       one       two       one       two       one       two     three
A      -1.089798  2.053026  0.470218  1.440740  0.274291  0.636257  0.091048
B       0.488875  0.428836  1.413451 -0.683677  0.668157  0.456931  0.227568
C      -0.243064 -0.069446 -0.911166  0.478370  0.333824  0.363060  0.949672
MaxU
quelle
Und wie kann man eine Spalte anhängen und unabhängig machen? Ich habe versucht mit: df = df.join(pd.DataFrame(np.random.rand(3, 1), columns = pd.MultiIndex.from_product([['new']]), index = df.index)) Ist der richtige Weg?
Chacho Fuva