2017-12-24 1 views
2

Ich habe ein DataFrame mit zwei Spalten und ich möchte die zweite Spalte unter dem ersten und dem ersten unter dem zweiten stapeln.Pandas-Stack zweite Spalte unter dem ersten und umgekehrt

pd.DataFrame({'A':[1,2,3], 'B': [4,5,6]}) 

    A B 
0 1 4 
1 2 5 
2 3 6 

gewünschte Ausgabe:

A B 
0 1 4 
1 2 5 
2 3 6 
3 4 1 
4 5 2 
5 6 3 

Bisher habe ich versucht:

pd.concat([df, df[['B','A']].rename(columns={'A':'B', 'B':'A'})]) 

    A B 
0 1 4 
1 2 5 
2 3 6 
3 4 1 
4 5 2 
5 6 3 

Ist dies der sauberste Weg?

+1

Was stimmt nicht mit concat. Es ist ordentlich – Dark

+0

Sie sagen mir! Ich bin kein Pandas-Experte, also frage ich :) – Imran

+1

Ja, sieht gut aus für mich –

Antwort

5

Concat ist besser, wenn Sie mich fragen. Aber wenn Sie eine 100 Spalten Umbenennung haben, ist ein Schmerz. Als ein allgemeiner Ansatz ist hier ein mit numpy flip und vstack d.h

v = df.values 
pd.DataFrame(pd.np.vstack((v, pd.np.fliplr(v))), columns=df.columns) 

    A B 
0 1 4 
1 2 5 
2 3 6 
3 4 1 
4 5 2 
5 6 3 
+1

Verwenden Sie 'fliplr', um von links nach rechts zu blättern, und erstellen Sie ein 2D-Array nur einmal (zweimaliges Ausführen ist ineffizient). –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ wir greifen nur auf die Daten mit df.values ​​richtig? Habe ich falsch zu denken, Array wird nicht erstellt, sondern nur zugegriffen? – Dark

+1

Es hängt davon ab, denke ich. In einigen Fällen wird eine Ansicht zurückgegeben, in anderen Fällen ist es ein neues Array. Sicher sein, nehme ich an. –

Verwandte Themen