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 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
# 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 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 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 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
# 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 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 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 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.
Weitere ErweiterungenFür große Datensätze priorisieren Sie die Verwendung kleinerer Datentypen (wie int8, int16, float32) und von Kategorietypen, um den Speicherverbrauch zu reduzieren.