Rzutowanie za pomocą astype()
Konwertuj kolumny na typy int, float, string, boolean i datetime za pomocą astype() oraz obsługuj typowe błędy konwersji.
Rzutowanie za pomocą astype() to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Wprowadzenie do astype()
Series.astype(dtype) konwertuje kolumnę z bieżącego typu na określony typ. Zwraca nowy obiekt Series (lub DataFrame, gdy zostanie wywołany dla całego obiektu DataFrame), nie modyfikując oryginału. Jest to podstawowe narzędzie Pandas do naprawiania problemów z dtype po wczytaniu danych; umożliwia konwersję między typami numerycznymi, na ciągi znaków, wartości logiczne oraz typ Categorical.
import pandas as pd
df = pd.DataFrame({'age': ['25', '30', '35']})
print('Before:', df['age'].dtype) # object
df['age'] = df['age'].astype(int)
print('After:', df['age'].dtype) # int64
print(df['age'] + 1) # [26, 31, 36] — arithmetic now worksKonwertowanie na typy numeryczne
Najczęstszą konwersją jest zmiana typu z object na typ numeryczny. Można rzutować dane na 'int64', 'int32', 'float64', 'float32' itd. Jeśli którejkolwiek wartości w kolumnie nie można przekonwertować, astype() zgłasza ValueError. Gdy kolumna może zawierać nienumeryczne ciągi znaków, należy zamiast tego użyć pd.to_numeric(series, errors='coerce') — nieprawidłowe wartości zostaną wtedy zamienione na NaN, zamiast powodować przerwanie działania.
import pandas as pd
df = pd.DataFrame({'price': ['10.5', '20.0', 'N/A', '30.5']})
# astype would crash on 'N/A'
# price_float = df['price'].astype(float) # ValueError!
# pd.to_numeric with errors='coerce' is safer
df['price_float'] = pd.to_numeric(df['price'], errors='coerce')
print(df)
# price price_float
# 0 10.5 10.5
# 1 20.0 20.0
# 2 N/A NaN
# 3 30.5 30.5Konwertowanie na ciąg znaków (object)
Rzutowanie kolumny na str (lub 'object') konwertuje każdą wartość na jej reprezentację tekstową. Jest to przydatne, gdy trzeba połączyć kolumnę numeryczną z kolumną tekstową albo zastosować metody obsługi ciągów znaków do danych numerycznych, takich jak identyfikatory wymagające uzupełnienia zerami. Pandas oferuje również nowszy dtype 'string', który zapewnia lepszą obsługę wartości NA w kolumnach tekstowych.
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3], 'region': ['E', 'W', 'N']})
# Concatenate id and region into a composite key
df['key'] = df['id'].astype(str) + '_' + df['region']
print(df)
# id region key
# 0 1 E 1_E
# 1 2 W 2_W
# 2 3 N 3_NKonwertowanie na wartości logiczne
Konwersja na wartości logiczne jest przydatna, gdy kolumny przechowują wartości True/False jako liczby całkowite (0/1) lub ciągi znaków („Yes”/„No”). Rzutowanie liczb całkowitych 0/1 za pomocą astype(bool) działa bezpośrednio: 0 staje się False, a każda wartość różna od zera staje się True. W przypadku kolumn zawierających ciągi „Yes”/„No” należy najpierw użyć mapowania ze słownikiem, a następnie wykonać rzutowanie.
import pandas as pd
df = pd.DataFrame({
'active_int': [1, 0, 1, 0],
'active_str': ['Yes', 'No', 'Yes', 'No']
})
# Integer to bool
df['active_bool'] = df['active_int'].astype(bool)
# String to bool via mapping
df['active_bool2'] = df['active_str'].map({'Yes': True, 'No': False})
print(df[['active_bool', 'active_bool2']])
# active_bool active_bool2
# 0 True True
# 1 False FalseZmniejszanie typów numerycznych
Domyślnie Pandas używa typów 64-bitowych. Jeśli wartości całkowite mieszczą się w 32, a nawet 8 bitach, można wykonać zmniejszanie typu do mniejszego typu, aby zmniejszyć zużycie pamięci o połowę (lub trzy czwarte). Użyj pd.to_numeric(series, downcast='integer') albo jawnie wykonaj rzutowanie za pomocą astype('int32'). Jest to ważna optymalizacja w przypadku dużych zbiorów danych.
import pandas as pd
import numpy as np
df = pd.DataFrame({'count': np.random.randint(0, 200, 1_000_000)})
print('int64 bytes:', df['count'].nbytes) # 8,000,000
df['count_int16'] = df['count'].astype('int16') # max 32767, fits 0-200
print('int16 bytes:', df['count_int16'].nbytes) # 2,000,000
# Or let Pandas choose the smallest type automatically
df['count_auto'] = pd.to_numeric(df['count'], downcast='integer')
print('auto dtype:', df['count_auto'].dtype)Konwertowanie całych obiektów DataFrame za pomocą astype(dict)
Można jednocześnie przekonwertować wiele kolumn, przekazując do df.astype() słownik, którego kluczami są nazwy kolumn, a wartościami — docelowe dtype. Jest to bardziej przejrzyste niż łańcuchowe przypisywanie poszczególnych kolumn i sprawia, że etap konwersji typów jest samodokumentującym się blokiem potoku.
import pandas as pd
df = pd.DataFrame({
'age': ['25', '30'],
'salary': ['50000', '70000'],
'is_manager': ['1', '0']
})
df = df.astype({
'age': 'int32',
'salary': 'float64',
'is_manager': 'bool'
})
print(df.dtypes)
# age int32
# salary float64
# is_manager boolObsługa błędów w astype()
astype() nie ma wbudowanego trybu tolerującego błędy (w przeciwieństwie do pd.to_numeric). Jeśli konwersja się nie powiedzie, zgłaszany jest ValueError lub OverflowError. Bezpieczny sposób postępowania wygląda tak: (1) najpierw wyczyść kolumnę (usuń symbole, uzupełnij wartości NaN), (2) następnie wykonaj rzutowanie. Alternatywnie w przypadku danych numerycznych użyj pd.to_numeric(errors='coerce') albo napisz niewielką funkcję pomocniczą przechwytującą błędy konwersji.
import pandas as pd
# Clean then cast pattern
df = pd.DataFrame({'price': ['$1,200', '$800', '$450']})
# Step 1: remove non-numeric characters
df['price_clean'] = (
df['price']
.str.replace('$', '', regex=False)
.str.replace(',', '', regex=False)
)
# Step 2: safe cast
df['price_num'] = df['price_clean'].astype(float)
print(df)
# price price_clean price_num
# 0 $1,200 1200 1200.0
# 1 $800 800 800.0
# 2 $450 450 450.0Rzutowanie na Pandas StringDtype
Nowszy dtype 'string' (wariant z wielką literą S lub pd.StringDtype()) wprowadzono, aby zapewnić pełnoprawną obsługę ciągów znaków z właściwą obsługą NA — brakujące ciągi są przechowywane jako pd.NA, a nie jako None lub np.nan. Umożliwia on korzystanie z akcesora .str i lepiej zachowuje semantykę NA niż dtype object; jest zalecany w nowym kodzie przeznaczonym dla Pandas 2+.
import pandas as pd
df = pd.DataFrame({'name': ['Alice', None, 'Carol']})
# Convert to the modern string dtype
df['name'] = df['name'].astype('string')
print(df['name'].dtype) # string
print(df['name'].isna()) # proper NA detection
# 0 False
# 1 True
# 2 FalseRyzyko przepełnienia podczas zmniejszania typu
Podczas zmniejszania typu do mniejszego typu całkowitego wartości wykraczające poza jego zakres ulegają cichemu przepełnieniu i zawijaniu. Na przykład rzutowanie wartości 300 na int8 (zakres od -128 do 127) daje 44 bez zgłoszenia błędu. Przed zmniejszeniem typu należy zawsze sprawdzić, czy rzeczywisty zakres danych mieści się w zakresie docelowego typu, aby uniknąć trudnych do wykrycia uszkodzeń danych.
import pandas as pd
import numpy as np
df = pd.DataFrame({'value': [100, 200, 300, 127, 128]})
# int8 range: -128 to 127
df['value_i8'] = df['value'].astype('int8')
print(df)
# value value_i8
# 0 100 100
# 1 200 -56 <- overflow! 200-256 = -56
# 2 300 44 <- overflow! 300-256 = 44
# 3 127 127
# 4 128 -128 <- overflow!
# Always check range first
print(df['value'].max()) # 300 > 127 — int8 is UNSAFE hereWeryfikowanie konwersji za pomocą mapy dtype
Po wykonaniu wielu konwersji typów należy zweryfikować końcowy schemat, porównując rzeczywiste dtype z oczekiwaną mapą. Ten wzorzec asercji wykrywa błędy, takie jak kolumna, której nie udało się przekonwertować (np. ponieważ wartość NaN uniemożliwiła konwersję na typ całkowity). Sprawdzaj to na końcu funkcji wczytującej dane, traktując je jako prosty test schematu.
import pandas as pd
df = pd.DataFrame({
'user_id': [1, 2, 3],
'amount': [10.5, 20.0, 30.5],
'active': [True, False, True]
})
expected = {'user_id': 'int64', 'amount': 'float64', 'active': 'bool'}
for col, dtype in expected.items():
assert str(df[col].dtype) == dtype, (
f'{col}: expected {dtype}, got {df[col].dtype}'
)
print('Schema validation passed')Przykład pełnego potoku konwersji
Podsumowując: oto realistyczny potok konwersji po read_csv, który czyści formatowanie, bezpiecznie obsługuje wartości NaN, rzutuje dane na optymalne typy i weryfikuje wynik. Ten schemat — wyczyść, wykonaj rzutowanie, zweryfikuj — powinien być standardowym elementem każdej funkcji pozyskiwania danych.
import pandas as pd
raw = pd.DataFrame({
'user_id': ['101', '102', '103'],
'revenue': ['$1,200', '$800', '$2,500'],
'active': ['Yes', 'No', 'Yes']
})
df = (
raw
.assign(
user_id=raw['user_id'].astype('int32'),
revenue=pd.to_numeric(
raw['revenue'].str.replace('[$,]', '', regex=True)
),
active=raw['active'].map({'Yes': True, 'No': False})
)
)
print(df.dtypes)
# user_id int32
# revenue float64
# active boolSzybkie sprawdzenie
Sprawdź swoją wiedzę na temat rzutowania za pomocą astype().
Podsumowanie lekcji
W tej lekcji nauczyli się Państwo, że: astype(dtype) konwertuje kolumnę lub cały obiekt DataFrame na nowy typ, pd.to_numeric(errors='coerce') jest bezpieczniejsze w przypadku kolumn zawierających nienumeryczne ciągi znaków, a przekazanie słownika do astype() umożliwia jednoczesną konwersję wielu kolumn. Podczas zmniejszania typu należy zachować ostrożność, aby uniknąć przepełnienia, i zawsze weryfikować końcowy schemat za pomocą asercji. Następnie omówimy oszczędny pamięciowo dtype Categorical.
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Rzutowanie za pomocą astype()” jest bezpłatna?
Tak — pełny tekst „Rzutowanie za pomocą astype()” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Rzutowanie za pomocą astype()”?
Konwertuj kolumny na typy int, float, string, boolean i datetime za pomocą astype() oraz obsługuj typowe błędy konwersji. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Rzutowanie za pomocą astype()”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Sprawdzanie typów danych kolumn
- Rzutowanie za pomocą astype()
- Kategoryczny typ danych
- Prawidłowe analizowanie dat