Sprawdzanie typów danych kolumn
Odczytaj atrybut dtypes, rozróżnij int64, float64 i object oraz znajdź kolumny wymagające konwersji.
Sprawdzanie typów danych kolumn to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 1 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.
Dlaczego typy danych kolumn mają znaczenie
Każda kolumna w obiekcie Pandas DataFrame ma wartość d type (typ danych), która określa sposób przechowywania wartości w pamięci oraz to, jakie operacje można na nich wykonywać. Kolumny liczb całkowitych z dtype object (ciągi znaków) nie można sumować. Data przechowywana jako ciąg znaków jest traktowana jako tekst, a nie jako szereg czasowy. Nieprawidłowe wartości dtype należą do najczęstszych przyczyn trudnych do wykrycia błędów i nieoczekiwanych wyników w potokach analizy danych.
Zawsze należy sprawdzić wartości dtype jako pierwszy krok po wczytaniu nowego zbioru danych.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': ['25', '30', '35'], # looks like int, stored as object
'salary': [50000, 60000, 70000], # int64
'hired': ['2022-01-01', '2023-06-15', '2024-03-10'] # looks like date
})
print(df.dtypes)
# age object
# salary int64
# hired object
# dtype: objectAtrybut dtypes
DataFrame.dtypes zwraca obiekt Series, którego indeks zawiera nazwy kolumn, a wartości — dtype Pandas każdej kolumny. Typowe wartości dtype, z którymi można się spotkać, to int64, float64, object (ciągi znaków i dane mieszane), bool, datetime64[ns] oraz category. Nazwa dtype informuje zarówno o rodzaju danych, jak i o liczbie bajtów używanych przez każdą wartość.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'int_col': [1, 2, 3],
'float_col': [1.5, 2.5, 3.5],
'str_col': ['a', 'b', 'c'],
'bool_col': [True, False, True]
})
print(df.dtypes)
# int_col int64
# float_col float64
# str_col object
# bool_col bool
# dtype: objectRozpoznawanie dtype object
Typ dtype object jest w Pandas uniwersalnym typem dla kolumn, których nie można przechowywać jako typu numerycznego ani logicznego. Zwykle oznacza dane tekstowe, ale może również wskazywać kolumnę zawierającą dane różnych typów (np. liczby całkowite wymieszane z ciągami znaków). Kolumny typu object zużywają więcej pamięci niż wyspecjalizowane typy dtype, a operacje na nich są wolniejsze. Gdy widzą Państwo object, warto zadać sobie pytanie: czy ta kolumna powinna zawierać ciągi znaków, liczby, kategorie czy daty?
import pandas as pd
df = pd.DataFrame({'mixed': [1, 'two', 3.0, None]})
print(df.dtypes)
# mixed object
# Check actual Python types inside the column
print(df['mixed'].apply(type).value_counts())
# <class 'int'> 1
# <class 'str'> 1
# <class 'float'> 2 (includes NaN which is float)info() — pełny przegląd typów
df.info() wyświetla zwięzłą tabelę zawierającą nazwę każdej kolumny, liczbę wartości innych niż null oraz dtype, a także całkowite użycie pamięci. To jedno polecenie daje pełny obraz jakości zbioru danych: jednocześnie można sprawdzić, które kolumny zawierają brakujące dane i które mają nieprawidłowe wartości dtype, dlatego jest to standardowe pierwsze polecenie po wczytaniu zbioru danych.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3],
'score': [88.5, 92.0, np.nan],
'grade': ['A', 'A', 'B']
})
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 id 3 non-null int64
# 1 score 2 non-null float64
# 2 grade 3 non-null object
# dtypes: float64(1), int64(1), object(1)
# memory usage: 200.0+ bytesTypowe problemy z dtype po read_csv
Podczas odczytywania pliku CSV Pandas określa dtype, skanując wartości. Pojawia się wtedy kilka typowych problemów: kolumny numeryczne są odczytywane jako object, jeśli zawierają separatory tysięcy w postaci przecinków lub symbole walut; kolumny logiczne są odczytywane jako object, jeśli przechowują ciągi znaków „Yes”/„No”; a kolumny dat są odczytywane jako object, ponieważ Pandas nie analizuje dat, jeśli nie zostanie o to poproszony. Rozpoznanie tych wzorców pozwala szybko je naprawić za pomocą konwersji typów.
import pandas as pd
import io
csv = '''price,date,is_active
'1,200',2024-01-15,Yes
'800',2024-02-20,No
'''
df = pd.read_csv(io.StringIO(csv))
print(df.dtypes)
# price object <- should be int
# date object <- should be datetime64
# is_active object <- should be boolZużycie pamięci przez różne wartości dtype
Różne wartości dtype mogą zużywać bardzo różne ilości pamięci. Kolumna int64 używa 8 bajtów na wartość, podczas gdy kolumna object przechowująca krótkie ciągi znaków może używać 50–200 bajtów na wartość. W przypadku obiektów DataFrame zawierających miliony wierszy wybór właściwego dtype może zmniejszyć zużycie pamięci z gigabajtów do megabajtów. Wywołaj df.memory_usage(deep=True), aby sprawdzić koszt w bajtach dla każdej kolumny.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'int64_col': np.arange(1_000_000, dtype='int64'),
'float32_col': np.arange(1_000_000, dtype='float32'),
'obj_col': ['a'] * 1_000_000
})
mem = df.memory_usage(deep=True) / 1024**2 # MB
print(mem.round(2))
# Index 0.00
# int64_col 7.63
# float32_col 3.81
# obj_col 55.26 <- much more for object!Wykrywanie kolumn numerycznych o nieprawidłowym typie
Częstym problemem jest kolumna numeryczna przechowywana jako object z powodu przypadkowych znaków formatowania. Można to wykryć, sprawdzając, czy pd.to_numeric(df['col'], errors='coerce') zwraca wynik różniący się od oryginalnej kolumny. Wartości, których nie można przeanalizować, stają się NaN, co dokładnie wskazuje wiersze powodujące niepowodzenie wnioskowania o typie.
import pandas as pd
df = pd.DataFrame({'revenue': ['1000', '2000', '$3000', '4,000']})
# Check which values can't be parsed as numbers
parsed = pd.to_numeric(df['revenue'], errors='coerce')
print(parsed)
# 0 1000.0
# 1 2000.0
# 2 NaN <- '$3000' failed
# 3 NaN <- '4,000' failedSprawdzanie niejednoznaczności między liczbami całkowitymi a zmiennoprzecinkowymi
Jeśli kolumna zawiera choć jedną wartość NaN, Pandas przechowuje kolumny liczb całkowity jako float64, ponieważ standardowe typy całkowite NumPy nie potrafią reprezentować NaN. Wynikowe wartości zmiennoprzecinkowe, takie jak 25.0, wyglądają jak liczby całkowite, ale są przechowywane jako zmiennoprzecinkowe. Pandas wprowadził typy całkowite obsługujące wartości null (Int64 z wielką literą I), które obsługują NaN, zachowując semantykę liczb całkowitych.
import pandas as pd
import numpy as np
df = pd.DataFrame({'count': [1, 2, np.nan, 4]})
print(df['count'].dtype) # float64 — because NaN is float
# Nullable integer type supports NaN
df['count'] = df['count'].astype('Int64') # capital I!
print(df)
# count
# 0 1
# 1 2
# 2 <NA>
# 3 4
print(df['count'].dtype) # Int64select_dtypes() do filtrowania według typu
df.select_dtypes(include=) pozwala wybrać wszystkie kolumny należące do określonej rodziny typów. Typowe argumenty to: 'number' (wszystkie typy numeryczne), 'object' (ciągi znaków), 'bool', 'datetime' oraz 'category'. Jest to bardzo przydatne na początku potoku, aby stosować czyszczenie numeryczne wyłącznie do kolumn numerycznych, a czyszczenie ciągów znaków wyłącznie do kolumn tekstowych.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30],
'salary': [50000.0, 70000.0],
'dept': ['Eng', 'HR']
})
numeric = df.select_dtypes(include='number')
print('Numeric columns:', numeric.columns.tolist())
# ['age', 'salary']
text = df.select_dtypes(include='object')
print('Text columns:', text.columns.tolist())
# ['name', 'dept']Tworzenie raportu dtype
Praktycznym nawykiem podczas EDA jest tworzenie raportu dtype, który zawiera dtype każdej kolumny, liczbę unikatowych wartości oraz przykładowe wartości. Pomaga to szybko zidentyfikować kolumny wymagające konwersji przed rozpoczęciem analizy. Taki raport można wygenerować za pomocą prostego obiektu DataFrame utworzonego na podstawie agregacji wykonywanych dla poszczególnych kolumn.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': [25, 30, 35],
'salary': [50000, 60000, 70000],
'dept': ['Eng', 'HR', 'Eng'],
'hired': ['2022-01-01', '2023-06-15', '2024-03-10']
})
report = pd.DataFrame({
'dtype': df.dtypes,
'unique_count': df.nunique(),
'sample': df.iloc[0]
})
print(report)Spójność dtype w potokach produkcyjnych
W potokach produkcyjnych przetwarzających codziennie nowe dane wartości dtype mogą z czasem ulec zmianie — kolumna, która zawsze miała typ int64, może zostać dostarczona jako float64, jeśli pojawi się w niej pojedyncza wartość NaN. Na początku potoku należy dodać asercje dtype, aby wcześnie wykrywać zmiany schematu. Jawne zgłoszenie błędu z czytelnym komunikatem jest znacznie lepsze niż ciche generowanie nieprawidłowych wyników w dalszej części potoku.
import pandas as pd
df = pd.DataFrame({'user_id': [1, 2, 3], 'score': [88.0, 92.0, 76.0]})
expected_dtypes = {'user_id': 'int64', 'score': 'float64'}
for col, expected in expected_dtypes.items():
actual = str(df[col].dtype)
assert actual == expected, (
f'Column {col}: expected {expected}, got {actual}'
)
print('All dtypes are correct')Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat analizowania typów danych kolumn.
Podsumowanie lekcji
W tej lekcji nauczyli się Państwo, że: df.dtypes pokazuje typ każdej kolumny, dtype object jest uniwersalnym typem dla ciągów znaków i danych mieszanych, a df.info() zapewnia pełny przegląd typów i wartości null. Używaj select_dtypes(), aby filtrować kolumny według rodziny typów, oraz dodawaj asercje dtype, aby wykrywać zmiany schematu w środowisku produkcyjnym. Następnie przekonwertujemy kolumny na właściwe dtype za pomocą astype().
Często zadawane pytania
Czy lekcja „Sprawdzanie typów danych kolumn” jest bezpłatna?
Tak — pełny tekst „Sprawdzanie typów danych kolumn” 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 „Sprawdzanie typów danych kolumn”?
Odczytaj atrybut dtypes, rozróżnij int64, float64 i object oraz znajdź kolumny wymagające 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 1 z 4.
Ile czasu zajmuje lekcja „Sprawdzanie typów danych kolumn”?
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