Skip to content

pandas: Transpose DataFrame (Zeilen und Spalten vertauschen)

Python

Verwenden Sie das T-Attribut oder die Methode transpose(), um die Zeilen und Spalten von pandas.DataFrame zu transponieren (= zu transponieren).

Keine Methode verändert das ursprüngliche Objekt, sondern gibt ein neues Objekt mit vertauschten Zeilen und Spalten zurück (= transponiertes Objekt).

Beachten Sie, dass abhängig vom Datentyp dtype jeder Spalte eine Ansicht anstelle einer Kopie erstellt wird und eine Änderung eines ursprünglichen und transponierten Objekte das andere.

Dieser Artikel hat folgenden Inhalt.

  • pandas.DataFrame.T
  • pandas.DataFrame.transpose()
  • Ändern Sie das ursprüngliche Objekt selbst
  • Typumwandlung
  • Ansehen und kopieren

Informationen zum Transponieren von numpy.ndarray oder einer zweidimensionalen Liste (Liste von Listen) finden Sie in den following Artikeln.

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

Ändern Sie das ursprüngliche Objekt selbst

Ein Parameter wie inplace, der das ursprüngliche Objekt selbst, wird nicht bereitgestellt. Wenn Sie kein neues Objekt erstellen möchten, können Sie es dem ursprünglichen Objekt selbst zuweisen.

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

Typumwandlung

Der pandas.DataFrame hat einen Datentyp für jede Spalte.

If alle Spalten betrachteten Datentyp Haben, bleibt der Datentyp auch bei Einer Transponierung mit T oder transpose() gleich.

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

Wenn jede Spalte einen anderen Datentyp hat, wird der Typ konvertiert. If eine Spalte beispielsweise sowohl eine Ganzzahl int als auch eine Fließkommazahl enthält, ist der Datentyp der Spalte 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

Es wird nicht wiederhergestellt, wenn es erneut transponiert wird. Sie sollten astype() anwenden, um den Datentyp umzuwandeln.

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

Der Datentyp einer Spalte, sterben den String str enthält, ist Objekt.

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

Weitere Informationen zu den Datentypen dtype und astype() finden Sie im following Artikel.

Ansehen und kopieren

Wenn alle Spalten betrachteten Datentyp haben, gibt T oder transpose() eine Ansicht zurück. Da sich das Original- und das Ansichtsobjekt den Speicher teilen, ändert das Ändern eines Elements das andere.

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

Wenn der Datentyp dtype für jede Spalte unterschiedlich ist, erstellen Sie T und transpose() eine Kopie. Da das transponierte Objekt einen neuen Speicherbereich allokiert, bleibt das unverändert, wenn eines geändert wird.

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

Wenn SIE das Originalobjekt und das transponierte Objekt getrennt behandeln möchten, wenn alle Spalten sichtbaren Datentyp haben: Sie copy() verwenden, um explizit eine Kopie mit T zu erstellen, und setzen Sie den Parameter copy auf True, um eine Kopie mit transpose() erstellen.

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

Der Standardwert von copy in transpose() ist False, wodurch nach Möglichkeit eine Ansicht anstelle einer Kopie erstellt wird. If der Datentyp dtype für jede Spalte unterschiedlich IST, wie im obigen Beispiel, WIRD auch bei copy=False eine Kopie erstellt.