Skip to content

pandas: Trasporre DataFrame (scambiare righe e colonne)

Python

Usa l’attributo To il metodo transpose() per scambiare (= trasporre) le righe e le colonne di pandas.DataFrame.

Nessuno dei due metodi cambia l’oggetto originale ma finisce un nuovo oggetto con le righe e le colonne scambiate (= trasposto).

Si noti che a seconda del tipo di dati dtype di ciascuna colonna, viene creata una vista anziché una copia e la modifica di uno degli oggetti originali e trasposti cambierà l’altro.

In questo articolo vengono descritti i seguenti contenuti.

  • panda.DataFrame.T
  • panda.DataFrame.transpose()
  • Cambia l’oggetto originale stesso
  • Digita la conversione
  • Visualizza e copia

Vedere i seguenti articoli per la trasposizione di numpy.ndarray o di un elenco bidimensionale (elenco di elenchi).

panda.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

panda.DataFrame.transpose()

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

Cambia l’oggetto originale stesso

Non viene fornito un parametro come inplace che modifica l’oggetto originale stesso. Se non vuoi creare un nuovo oggetto, puoi assegnarlo all’oggetto originale stesso.

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

Digita la conversione

pandas.DataFrame ha un tipo di dati dtype per ogni colonna.

Se tutte le colonne hanno lo stesso tipo di dati, il tipo di dati rimane lo stesso anche se trasposto con To 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

Se ogni colonna ha un tipo di dati diverso, il tipo viene convertito. Ad esempio, se una colonna contiene sia un intero int che un numero a virgola mobile float, il tipo di dati della colonna è 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

Non verrà ripristinato se verrà nuovamente trasposto. Dovresti applicare astype() per eseguire il cast del tipo di dati.

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

Il tipo di dati di una colonna contenente la stringa str è oggetto.

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

Per ulteriori informazioni sui tipi di dati dtype e astype(), vedere l’articolo seguente.

Visualizza e copia

Se tutte le colonne hanno lo stesso tipo di dati, To transpose() richiede una vista. Poiché l’originale e gli oggetti di voce condividono la memoria, la modifica di un elemento cambierà l’altro.

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

Se il tipo di creare dati dtype è diverso per ciascuna colonna, T e transpose() una copia. Poiché l’oggetto trasposto assegna una nuova area di memoria, se una viene modificata, l’altra rimane invariata.

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

Se si desidera gestire l’oggetto originale e l’oggetto trasposto separatamente quando tutte le colonne hanno lo stesso tipo di dati: utilizzare copy() per creare inizialmente una copia con T e impostare il parametro copy su True per creare una copia con 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

Il valore predefinito di copy in transpose() è False, che crea una vista invece di una copia, se possibile. Se il tipo di dati dtype è diverso per ciascuna colonna, come nell’esempio precedente, viene creata una copia anche se copy=False.