Comment échanger les lignes et les colonnes (i.e. transposer) une dataframe avec pandas en python ?

Exemples de comment échanger les lignes et les colonnes (i.e. transposer) une dataframe avec pandas en python:

Créer un dataframe avec pandas

Créons d'abord une dataframe avec pandas

import pandas as pd

data = {'Age':[21,26,82,15,28],
        'Id':['jch2c1','63jc2h','hg217d','hj127b','edew32'],
        'weight':[120,148,139,156,129],
        'Gender':['male','male','female','male','female'],
        'Country':['France','USA','USA','Germany','USA']}

df = pd.DataFrame(data=data,index=['A','B','C','D','E'])

donne

   Age      Id  weight  Gender  Country
A   21  jch2c1     120    male   France
B   26  63jc2h     148    male      USA
C   82  hg217d     139  female      USA
D   15  hj127b     156    male  Germany
E   28  edew32     129  female      USA

Transposer une dataframe

Pour transposer rapidement une dataframe, une solution simple consiste à faire :

df.T

donne ici

              A       B       C        D       E
Age          21      26      82       15      28
Id       jch2c1  63jc2h  hg217d   hj127b  edew32
weight      120     148     139      156     129
Gender     male    male  female     male  female
Country  France     USA     USA  Germany     USA

Pour le rendre plus permanent:

df = df.T

Transposer une dataframe avec transpose()

Avec l'option copy = False

Une autre solution consiste à utiliser

new_df = df.transpose()

Notez que par défaut transpose() a l'option copy = False.

donne

              A       B       C        D       E
Age          21      26      82       15      28
Id       jch2c1  63jc2h  hg217d   hj127b  edew32
weight      120     148     139      156     129
Gender     male    male  female     male  female
Country  France     USA     USA  Germany     USA

Ensuite, si la dataframe d'origine est modifiée :

df.loc['A','weight'] = -9999

donne

   Age      Id  weight  Gender  Country
A   21  jch2c1   -9999    male   France
B   26  63jc2h     148    male      USA
C   82  hg217d     139  female      USA
D   15  hj127b     156    male  Germany
E   28  edew32     129  female      USA

la dataframe transposée n'est pas affectée puisque copy = False

              A       B       C        D       E
Age          21      26      82       15      28
Id       jch2c1  63jc2h  hg217d   hj127b  edew32
weight      120     148     139      156     129
Gender     male    male  female     male  female
Country  France     USA     USA  Germany     USA

Avec l'option copy = True

Maintenant avec l'option copy = True:

new_df = df.transpose(copy=True)

si la dataframe d'origine est modifiée :

df.loc['A','weight'] = -9999

donne

   Age      Id  weight  Gender  Country
A   21  jch2c1   -9999    male   France
B   26  63jc2h     148    male      USA
C   82  hg217d     139  female      USA
D   15  hj127b     156    male  Germany
E   28  edew32     129  female      USA

alors la dataframe transposée est AUSSI affectée :

              A       B       C        D       E
Age          21      26      82       15      28
Id       jch2c1  63jc2h  hg217d   hj127b  edew32
weight    -9999     148     139      156     129
Gender     male    male  female     male  female
Country  France     USA     USA  Germany     USA

Références