Pandas-Datentypen (dtype und Typkonvertierung)

Pandas bietet ein umfangreiches Datentypsystem. Das korrekte Verständnis und die Verwendung von Datentypen ist die Grundlage für eine effiziente Datenanalyse. In diesem Abschnitt werden das Datentypsystem von Pandas, die Typinferenz und die Methoden zur Typkonvertierung ausführlich behandelt.


Überblick über Pandas-Datentypen

dtype Beschreibung Python-Typ Beispiel
int64 64-Bit-Ganzzahl int 1, 2, 100
float64 64-Bit-Gleitkommazahl float 1.5, 3.14
object Zeichenkette oder gemischter Typ str "hello"
bool Boolean bool True, False
datetime64[ns] Datetime datetime 2024-01-01
timedelta64[ns] Timedelta timedelta 1 days
category Kategorischer Typ - Endliche Menge

Beispiel

import pandas as pd
import numpy as np

# Erstellen Sie einen DataFrame mit verschiedenen Datentypen
df = pd.DataFrame({
    "Integer": [1, 2, 3],
    "Float": [1.5, 2.5, 3.5],
    "String": ["a", "b", "c"],
    "Boolean": [True, False, True],
    "Date": pd.date_range("2024-01-01", periods=3)
})

print("Spaltendatentypen:")
print(df.dtypes)

Typinferenz und Spezifikation

Automatische Typinferenz

Beispiel

import pandas as pd

# Typinferenz beim Lesen von CSV
# pandas versucht, den am besten geeigneten Typ für jede Spalte abzuleiten
df = pd.read_csv("data.csv")

# Oder verwenden Sie den dtype-Parameter, um Typen explizit anzugeben
df = pd.read_csv("data.csv", dtype={
    "Age": "int32",     # Als 32-bit-Ganzzahl angeben, um Speicher zu sparen
    "Salary": "float32",   # Als 32-bit-Gleitkommazahl angeben
    "Name": "string"     # PyArrow-String verwenden
})

Typen bei der Erstellung festlegen

Beispiel

import pandas as pd
import numpy as np

# Datentyp zum Erstellen einer Series angeben
s = pd.Series([1, 2, 3], dtype="int8")  # Einen kleineren Ganzzahltyp verwenden
print(f"int8-Typ: {s.dtype}")

s = pd.Series([1.5, 2.5, 3.5], dtype="float32")  # float32 verwenden
print(f"float32-Typ: {s.dtype}")

# numpy-Typ verwenden
s = pd.Series([1, 2, 3], dtype=np.int8)
print(f"np.int8-Typ: {s.dtype}")

Typkonvertierung

Konvertieren mit astype

Beispiel

import pandas as pd
import numpy as np

# Beispieldaten erstellen
df = pd.DataFrame({
    "Integer": [1, 2, 3],
    "Float": [1.5, 2.5, 3.5],
    "String": ["1", "2", "3"],
    "Boolean": [1, 0, 1]
})

print("Ursprüngliche Typen:")
print(df.dtypes)
print()

# In Zeichenkette konvertieren
df["Integer_str"] = df["Integer"].astype(str)
print("Nach Konvertierung in eine Zeichenkette:")
print(df.dtypes)

# Zeichenkette in numerischen Wert konvertieren
df["String_int"] = df["String"].astype(int)
print("\n"Zeichenkette in Ganzzahl:")
print(df.dtypes)

# Numerischen Wert in Boolean konvertieren (ungleich null ist True)
df["Boolean_int"] = df["Boolean"].astype(bool)
print("\n"Ganzzahl in Boolean:")
print(df.dtypes)

# Float in Ganzzahl umwandeln (Trunkierung)
df["Float_int"] = df["Float"].astype(int)
print("\n"Float in Ganzzahl:")
print(df)

Umwandlung mit pd.to_numeric

Beispiel

import pandas as pd
import numpy as np

# Numerische Zeichenketten mit Sonderzeichen behandeln
s = pd.Series(["$1,000", "$2,500", "$3,200"])

# Bereinigen und konvertieren
s_cleaned = s.str.replace("$", "", regex=False).str.replace(",", "", regex=False)
s_numeric = pd.to_numeric(s_cleaned)
print("String in numerisch:")
print(s_numeric)
print(f"Typ: {s_numeric.dtype}")
print()

# Fehlende Werte behandeln
s_with_na = pd.Series(["1", "2", "NA", "4"])
s_numeric = pd.to_numeric(s_with_na, errors="coerce")  # Ungültige Werte in NaN umwandeln
print("Umgang mit fehlenden Werten:")
print(s_numeric)

Datumsangaben mit pd.to_datetime konvertieren

Beispiel

import pandas as pd

# Verschiedene Datumsformate konvertieren
dates = ["2024-01-01", "2024/01/02", "01/03/2024", "20240104"]

# Datumsangaben konvertieren
dt = pd.to_datetime(dates, errors="coerce")
print("Ergebnis der Datumskonvertierung:")
print(dt)
print(f"Typ: {dt.dtype}")
print()

# Datumsformat angeben
dates2 = ["20240101", "20240102", "20240103"]
dt2 = pd.to_datetime(dates2, format="%Y%m%d")
print("Konvertierung mit angegebenem Format:")
print(dt2)

Speicheroptimierung

Die Wahl geeigneter Datentypen kann den Speicherverbrauch erheblich reduzieren.

Auswahl von Integer-Typen

Beispiel

import pandas as pd
import numpy as np

# Eine Series mit einer großen Datenmenge erstellen
s = pd.Series(np.random.randint(0, 100, 1000000))

# Standard int64
print(f"int64-Speicher: {s.dtype} -> {s.memory_usage(deep=True) / 1024 / 1024:.2f} MB")

# In einen kleineren Typ konvertieren
s_int8 = s.astype("int8")
print(f"int8-Speicher: {s_int8.dtype} -> {s_int8.memory_usage(deep=True) / 1024 / 1024:.2f} MB")

# Wählen Sie einen geeigneten Typ basierend auf dem Datenbereich
# np.iinfo zum Anzeigen des Integer-Bereichs
print(f"\n"int8-Bereich: {np.iinfo('int8').min} bis {np.iinfo('int8').max}")
print(f"int16-Bereich: {np.iinfo('int16').min} bis {np.iinfo('int16').max}")
print(f"int32-Bereich: {np.iinfo('int32').min} bis {np.iinfo('int32').max}")

Verwendung des category-Typs

Beispiel

import pandas as pd
import numpy as np

# Eine Series mit vielen Duplikaten erstellen
s = pd.Series(np.random.choice(["Beijing", "Shanghai", "Guangzhou", "Shenzhen"], 1000000))

# String-Typ
print(f"object-Typ-Speicher: {s.dtype} -> {s.memory_usage(deep=True) / 1024 / 1024:.2f} MB")

# In Kategorietyp konvertieren
s_cat = s.astype("category")
print(f"Speicherbedarf des Kategorietyps: {s_cat.dtype} -> {s_cat.memory_usage(deep=True) / 1024 / 1024:.2f} MB")

# Nachteil: Einige Operationen können langsamer werden
print("\n"Kategorie-Info:")
print(s_cat.cat.categories)

Typüberprüfung und Validierung

Beispiel

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "Integer": [1, 2, 3],
    "Float": [1.5, 2.5, 3.5],
    "String": ["a", "b", "c"]
})

# Datentypen überprüfen
print("Prüfen, ob es ein numerischer Typ ist:")
print(df.dtypes)

# is_integer_dtype verwenden
print(f"\n"Integer-Spalte: {pd.api.types.is_integer_dtype(df['Integer'])}")
print(f"Float-Spalte: {pd.api.types.is_float_dtype(df['Float'])}")
print(f"String-Spalte: {pd.api.types.is_object_dtype(df['String'])}")

# Prüfen, ob es in einen numerischen Typ konvertiert werden kann
print(f"\n"Kann in einen numerischen Typ konvertiert werden: {pd.api.types.is_numeric_dtype(df['Integer'])}")
print(f"Ist datetime: {pd.api.types.is_datetime64_any_dtype(pd.Series(pd.date_range('2024', periods=3)))}")

Häufige Probleme

1. Float-Werte erscheinen in Integer-Spalten

Wenn es in einen DataFrame gemischt wird, konvertiert es automatisch in float64. Verwenden SieNullable IntegerDer Typ kann Integer-Nullwerte beibehalten.

2. Inkonsistente Datumsformate

Verwenden Siepd.to_datetimeund geben Sieformatden Parameter an, um nicht standardmäßige Formate zu behandeln.

3. Typfehler beim Einlesen von CSV

Verwenden Siedtypeden Parameter, um den Typ explizit anzugeben, oder verwenden Sieconvertersum zu konvertieren.

Für große Datensätze priorisieren Sie die Verwendung kleinerer Datentypen (wie int8, int16, float32) und von Kategorietypen, um den Speicherverbrauch zu reduzieren.

Weitere Erweiterungen