Skip to content

pandas : Transpose DataFrame (échange de lignes et de colonnes)

Utilisez l’attribut T ou la méthode transpose() pour échanger (= transposer) les lignes et les colonnes de pandas.DataFrame.

Aucune des deux méthodes ne modifie l’objet d’origine mais renvoie un nouvel objet avec les lignes et les colonnes échangées (= objet transposé).

Notez qu’en fonction du type de données dtype de chaque colonne, une vue est créée au lieu d’une copie, et la modification de l’un des objets d’origine et transposés modifiera l’autre.

Cet article décrit le contenu suivant.

  • pandas.DataFrame.T
  • pandas.DataFrame.transpose()
  • Modifier l’objet d’origine lui-même
  • Conversion de types
  • Visualiser et copier

Voir les articles suivants pour transposer numpy.ndarray ou une liste à deux dimensions (liste de listes).

pandas.DataFrame.T

import pandas as pd

df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
print(df)
#    X  Y
# A  0  3
# B  1  4
# C  2  5

print(df.T)
#    A  B  C
# X  0  1  2
# Y  3  4  5

pandas.DataFrame.transpose()

print(df.transpose())
#    A  B  C
# X  0  1  2
# Y  3  4  5

Modifier l’objet d’origine lui-même

Un paramètre comme inplace qui modifie l’objet d’origine lui-même n’est pas fourni. Si vous ne souhaitez pas créer un nouvel objet, vous pouvez l’affecter à l’objet d’origine lui-même.

df = df.T
print(df)
#    A  B  C
# X  0  1  2
# Y  3  4  5

Conversion de types

Le pandas.DataFrame a un type de données dtype pour chaque colonne.

Si toutes les colonnes ont le même type de données, le type de données reste le même même s’il est transposé avec T ou transpose().

df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
print(df)
#    X  Y
# A  0  3
# B  1  4
# C  2  5

print(df.dtypes)
# X    int64
# Y    int64
# dtype: object

print(df.T)
#    A  B  C
# X  0  1  2
# Y  3  4  5

print(df.T.dtypes)
# A    int64
# B    int64
# C    int64
# dtype: object

Si chaque colonne a un type de données différent, le type est converti. Par exemple, si une colonne contient à la fois un entier int et un nombre à virgule flottante float, le type de données de la colonne est float.

df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3]}, index=['A', 'B', 'C'])
print(df_mix)
#    col_int  col_float
# A        0        0.1
# B        1        0.2
# C        2        0.3

print(df_mix.dtypes)
# col_int        int64
# col_float    float64
# dtype: object

print(df_mix.T)
#              A    B    C
# col_int    0.0  1.0  2.0
# col_float  0.1  0.2  0.3

print(df_mix.T.dtypes)
# A    float64
# B    float64
# C    float64
# dtype: object

Il ne sera pas restauré s’il est transposé à nouveau. Vous devez appliquer astype() pour convertir le type de données.

print(df_mix.T.T)
#    col_int  col_float
# A      0.0        0.1
# B      1.0        0.2
# C      2.0        0.3

print(df_mix.T.T.dtypes)
# col_int      float64
# col_float    float64
# dtype: object

Le type de données d’une colonne contenant la chaîne str est object.

df_mix2 = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3], 'col_str': ['a', 'b', 'c']},
                       index=['A', 'B', 'C'])
print(df_mix2)
#    col_int  col_float col_str
# A        0        0.1       a
# B        1        0.2       b
# C        2        0.3       c

print(df_mix2.dtypes)
# col_int        int64
# col_float    float64
# col_str       object
# dtype: object

print(df_mix2.T)
#              A    B    C
# col_int      0    1    2
# col_float  0.1  0.2  0.3
# col_str      a    b    c

print(df_mix2.T.dtypes)
# A    object
# B    object
# C    object
# dtype: object

print(df_mix2.T.T)
#   col_int col_float col_str
# A       0       0.1       a
# B       1       0.2       b
# C       2       0.3       c

print(df_mix2.T.T.dtypes)
# col_int      object
# col_float    object
# col_str      object
# dtype: object

Pour plus d’informations sur les types de données dtype et astype(), consultez l’article suivant.

Visualiser et copier

Si toutes les colonnes ont le même type de données, T ou transpose() renvoie une vue. Étant donné que les objets d’origine et de vue partagent la mémoire, la modification d’un élément modifiera l’autre.

df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
print(df)
#    X  Y
# A  0  3
# B  1  4
# C  2  5

df_T = df.T
print(df_T)
#    A  B  C
# X  0  1  2
# Y  3  4  5

df_transpose = df.transpose()
print(df_transpose)
#    A  B  C
# X  0  1  2
# Y  3  4  5

df.at['A', 'X'] = 100
print(df)
#      X  Y
# A  100  3
# B    1  4
# C    2  5

print(df_T)
#      A  B  C
# X  100  1  2
# Y    3  4  5

print(df_transpose)
#      A  B  C
# X  100  1  2
# Y    3  4  5

Si le type de données dtype est différent pour chaque colonne, T et transpose() créent une copie. L’objet transposé allouant une nouvelle zone mémoire, si l’on change l’un, l’autre reste inchangé.

df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3]}, index=['A', 'B', 'C'])
print(df_mix)
#    col_int  col_float
# A        0        0.1
# B        1        0.2
# C        2        0.3

df_mix_T = df_mix.T
print(df_mix_T)
#              A    B    C
# col_int    0.0  1.0  2.0
# col_float  0.1  0.2  0.3

df_mix_transpose = df_mix.transpose()
print(df_mix_transpose)
#              A    B    C
# col_int    0.0  1.0  2.0
# col_float  0.1  0.2  0.3

df_mix.at['A', 'col_int'] = 100
print(df_mix)
#    col_int  col_float
# A      100        0.1
# B        1        0.2
# C        2        0.3

print(df_mix_T)
#              A    B    C
# col_int    0.0  1.0  2.0
# col_float  0.1  0.2  0.3

print(df_mix_transpose)
#              A    B    C
# col_int    0.0  1.0  2.0
# col_float  0.1  0.2  0.3

Si vous souhaitez gérer l’objet d’origine et l’objet transposé séparément lorsque toutes les colonnes ont le même type de données : utilisez copy() pour créer explicitement une copie avec T et définissez le paramètre copy sur True pour créer une copie avec transpose().

df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
print(df)
#    X  Y
# A  0  3
# B  1  4
# C  2  5

df_T_copy = df.T.copy()
print(df_T_copy)
#    A  B  C
# X  0  1  2
# Y  3  4  5

df_transpose_copy = df.transpose(copy=True)
print(df_transpose_copy)
#    A  B  C
# X  0  1  2
# Y  3  4  5

df.at['A', 'X'] = 100
print(df)
#      X  Y
# A  100  3
# B    1  4
# C    2  5

print(df_T_copy)
#    A  B  C
# X  0  1  2
# Y  3  4  5

print(df_transpose_copy)
#    A  B  C
# X  0  1  2
# Y  3  4  5

La valeur par défaut de copy dans transpose() est False, ce qui crée une vue au lieu d’une copie si possible. Si le type de données dtype est différent pour chaque colonne, comme dans l’exemple ci-dessus, une copie est créée même si copy=False.