
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.
