
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.
