Pandas & NumPy Academy · Oppitunti

Sarakkeiden tietotyyppien tarkastelu

Lukekaa dtypes-attribuutti, erottakaa int64-, float64- ja object-tyypit toisistaan ja tunnistakaa muunnosta tarvitsevat sarakkeet.

Oppitunti 1/413 vaihetta

Sarakkeiden tietotyyppien tarkastelu on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Miksi sarakkeiden tietotyypeillä on merkitystä

Jokaisella Pandas DataFrame -tietokehyksen sarakkeella on dtype (tietotyyppi), joka määrittää, miten arvot tallennetaan muistiin ja mitkä operaatiot ovat niille sallittuja. object-tyyppistä (merkkijonoja sisältävää) kokonaislukusaraketta ei voi summata. Merkkijonona tallennettua päivämäärää käsitellään tekstinä, ei aikasarjana. Virheelliset tietotyypit ovat yksi yleisimmistä hiljaisten virheiden ja odottamattomien tulosten aiheuttajista data-analyysin käsittelyputkissa.

Tarkistakaa tietotyypit aina ensimmäisenä heti uuden aineiston lataamisen jälkeen.

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: object

dtypes-määrite

DataFrame.dtypes palauttaa Series-olion, jonka indeksinä ovat sarakkeiden nimet ja arvoina kunkin sarakkeen Pandas-tietotyypit. Yleisiä tietotyyppejä ovat int64, float64, object (merkkijonot ja sekalaiset arvot), bool, datetime64[ns] ja category. Tietotyypin nimi kertoo sekä datan lajin että sen, kuinka monta tavua kukin arvo käyttää.

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: object

object-tietotyypin tunnistaminen

object-tietotyyppi on Pandasin yleinen tyyppi sarakkeille, joita ei voi tallentaa numeerisena tai totuusarvotyyppinä. Se tarkoittaa yleensä merkkijonodataa, mutta voi viitata myös sekalaisia tyyppejä sisältävään sarakkeeseen (esimerkiksi kokonaislukuja ja merkkijonoja sekaisin). Object-sarakkeet kuluttavat enemmän muistia kuin erikoistuneet tietotyypit, ja niiden käsittely on hitaampaa. Kun näette arvon object, kysykää: pitäisikö tämän olla merkkijono, luku, kategoria vai päivämäärä?

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() täydelliseen tyyppikatsaukseen

df.info() tulostaa tiiviin taulukon, jossa näkyvät jokaisen sarakkeen nimi, muiden kuin puuttuvien arvojen määrä ja tietotyyppi sekä muistin kokonaiskäyttö. Tällä yhdellä komennolla saatte kattavan yleiskuvan aineiston laadusta: näette samalla kertaa sekä puuttuvia tietoja sisältävät sarakkeet että virheelliset tietotyypit. Siksi se on tavallinen ensimmäinen komento aineiston lataamisen jälkeen.

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+ bytes

Yleiset dtype-ongelmat read_csv:n jälkeen

Kun Pandas lukee CSV-tiedoston, se päättelee tietotyypit arvoja tutkimalla. Tästä aiheutuu useita yleisiä ongelmia: numeeriset sarakkeet luetaan object-tyyppisinä, jos niissä on tuhaterottimina pilkkuja tai valuuttasymboleita; totuusarvosarakkeet luetaan object-tyyppisinä, jos ne on tallennettu merkkijonoina 'Yes'/'No'; ja päivämääräsarakkeet luetaan object-tyyppisinä, koska Pandas ei jäsennä päivämääriä ilman erillistä ohjetta. Kun tunnistatte nämä tilanteet, voitte korjata ne nopeasti tyyppimuunnoksella.

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 bool

Eri dtype-tyyppien muistinkäyttö

Eri tietotyypit käyttävät hyvin eri määrän muistia. int64-sarake käyttää 8 tavua arvoa kohden, kun taas lyhyitä merkkijonoja sisältävä object-sarake saattaa käyttää 50–200 tavua arvoa kohden. Miljoonia rivejä sisältävissä DataFrame-kehyksissä oikean tietotyypin valinta voi pienentää muistinkäytön gigatavuista megatavuihin. Kutsukaa komentoa df.memory_usage(deep=True) nähdäksenne sarakekohtaisen tavukustannuksen.

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!

Väärän tyyppisten numeeristen sarakkeiden tunnistaminen

Yleinen ongelma on, että numeerinen sarake on tallennettu object-tyyppisenä ylimääräisten muotoilumerkkien vuoksi. Voitte havaita tämän tarkistamalla, tuottaako pd.to_numeric(df['col'], errors='coerce') eri tuloksen kuin alkuperäinen sarake. Arvot, joita ei voi jäsentää, muuttuvat arvoiksi NaN, jolloin näette täsmälleen, mitkä rivit aiheuttivat tyypin päättelyn epäonnistumisen.

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' failed

Kokonaisluvun ja liukuluvun sekaannuksen tarkistaminen

Kun sarakkeessa on yksikin NaN-arvo, Pandas tallentaa kokonaislukusarakkeet float64-tyyppisinä, koska NumPyn tavalliset kokonaislukutyypit eivät pysty esittämään NaN-arvoa. Tuloksena syntyvät liukuluvut, kuten 25.0, näyttävät kokonaisluvuilta, mutta ne tallennetaan liukulukuina. Pandas toi käyttöön puuttuvia arvoja tukevat kokonaislukutyypit (Int64, jossa I-kirjain on iso), jotka tukevat NaN-arvoja ja säilyttävät samalla kokonaislukujen semantiikan.

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)  # Int64

select_dtypes() tyyppipohjaiseen suodatukseen

df.select_dtypes(include=) mahdollistaa kaikkien tiettyyn tyyppiperheeseen kuuluvien sarakkeiden valitsemisen. Yleisiä argumentteja ovat 'number' (kaikki numeeriset tyypit), 'object' (merkkijonot), 'bool', 'datetime' ja 'category'. Tämä on erittäin hyödyllistä käsittelyputken alussa, koska sen avulla numeerinen puhdistus voidaan kohdistaa vain numeerisiin sarakkeisiin ja merkkijonojen puhdistus vain tekstisarakkeisiin.

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']

dtype-raportin laatiminen

Käytännöllinen EDA-tapa on laatia dtype-raportti, jossa luetellaan kunkin sarakkeen tietotyyppi, yksilöllisten arvojen määrä ja esimerkkitietoja. Näin tunnistatte nopeasti sarakkeet, jotka on muunnettava ennen analyysin aloittamista. Tällaisen raportin voi muodostaa yksinkertaisesti DataFramesta, joka rakennetaan sarakekohtaisten aggregointien avulla.

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)

Tietotyyppien yhdenmukaisuus tuotantokäsittelyputkissa

Uutta dataa päivittäin käsittelevissä tuotantokäsittelyputkissa tietotyypit voivat muuttua vähitellen — sarake, joka on aina ollut int64, saattaa saapua float64-tyyppisenä, jos siihen ilmestyy yksikin NaN-arvo. Lisätkää käsittelyputken alkuun dtype-väitteet, jotta skeeman muutokset havaitaan ajoissa. Selkeän virheen ilmoittaminen on paljon parempi vaihtoehto kuin virheellisten tulosten tuottaminen myöhemmin kaikessa hiljaisuudessa.

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')

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte sarakkeiden tietotyyppien tarkistamisen.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että df.dtypes näyttää kunkin sarakkeen tyypin, object-tietotyyppi on merkkijonojen ja sekalaisia tyyppejä sisältävien sarakkeiden yleinen tyyppi ja df.info() antaa kattavan yleiskuvan tyypeistä ja puuttuvista arvoista. Suodattakaa sarakkeita tyyppiperheen perusteella select_dtypes()-menetelmällä ja lisätkää dtype-väitteitä havaitaksenne skeeman muuttumisen tuotannossa. Seuraavaksi muunnamme sarakkeet oikeisiin tietotyyppeihin astype()-menetelmällä.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Sarakkeiden tietotyyppien tarkastelu” ilmainen?

Kyllä – oppitunnin ”Sarakkeiden tietotyyppien tarkastelu” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Sarakkeiden tietotyyppien tarkastelu”?

Lukekaa dtypes-attribuutti, erottakaa int64-, float64- ja object-tyypit toisistaan ja tunnistakaa muunnosta tarvitsevat sarakkeet. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Sarakkeiden tietotyyppien tarkastelu”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?

Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Sarakkeiden tietotyyppien tarkastelu
  2. Tyyppimuunnokset astype()-menetelmällä
  3. Kategorinen tietotyyppi
  4. Päivämäärien oikea jäsentäminen
← Takaisin: Pandas & NumPy Academy