56 Andmete muutmine ja selekteerimine andmetabelis

Andmetabelis tuleb sageli ette seda, et on vaja selekteerida teatud rida või veerg ning selle väärtust muuta. Järgmistes näidetes tutvustame, kuidas andmefreimis ridu ja veerge selekteerida.

Rea selekteerimine

Eelmises näites nägime, et hinnetetabelis on puuduvaid väärtusi (NaN), sest kõigi õpilaste bioloogia hindeid ei olnud esimeses hinnetetabelis. Lisame järgmises näites ka puuduvad bioloogia hinded.

Andmefreimis on võimalik vastav rida leida tabelis selle indeksi või selle sildi järgi. Nii nagu seerias, saab ka andmefreimis määrata sildid iga rea jaoks.

Esmalt vaatame näidet, kus me kasutame rea leidmiseks selle indeksit. Pandase moodulis kasutatakse vastava indeksiga rea selekteerimiseks funktsiooni iloc. Selle funtksiooni kasutamine on sarnane tavalise Pythoni järjendist vastava indeksiga elemendi võtmisega, kus järjendi nime järel kirjutatakse nurksulgude vahele vastav indeks. iloc funktsiooni puhul peab funktsiooni nime järel nurksulgude vahele kirjutama vastava indeksi. Esmalt leiame tabeli esimese rea ja väljastame selle.

sonastik_A = {'Nimi': ['Malle', 'Saara', 'Kusti', 'Aksel', 'Kalmer'],
            'Matemaatika': [4, 5, 3, 4, 5],
            'Programmeerimine': [4, 5, 5, 4, 3]}

sonastik_B = {'Nimi': ['Sulev', 'Guido', 'Ada', 'Moona'],
            'Matemaatika': [4, 5, 4, 5],
            'Programmeerimine': [4, 5, 4, 3],
            'Bioloogia': [5, 2, 3, 4]}

hinded_A = pd.DataFrame(sonastik_A)
hinded_B = pd.DataFrame(sonastik_B)

hinded = pd.concat([hinded_A, hinded_B], ignore_index=True)

# Väljastame esimese rea
print(hinded.iloc[0])
>>> %Run guido.py
  Nimi                Malle
  Matemaatika             4
  Programmeerimine        4
  Bioloogia             NaN
  Name: 0, dtype: object

Nüüd lisame ka Mallele bioloogia hinde ja väljastame terve tabeli. Kuna soovime muuta ainult üht väärtust bioloogia hinnete veerus, siis iloc funktsiooni kasutamisel peame ka vastava veeru määrama.

hinded['Bioloogia'].iloc[0] = 5

print(hinded)
>>> %Run guido.py
       Nimi  Matemaatika  Programmeerimine  Bioloogia
  0   Malle            4                 4        5.0
  1   Saara            5                 5        NaN
  2   Kusti            3                 5        NaN
  3   Aksel            4                 4        NaN
  4  Kalmer            5                 3        NaN
  5   Sulev            4                 4        5.0
  6   Guido            5                 5        2.0
  7     Ada            4                 4        3.0
  8   Moona            5                 3        4.0

 

Näeme, et Mallel on bioloogia hinne olemas. Lisame ka Saarale ja Kalmerile hinded. Seda saame ka korraga teha, sest iloc funktsioon võimaldab ka erinevate indeksitega read korraga selekteerida. Selleks peab iloc funktsiooni nurksulgude vahele lisama järjendi, kus on soovitud indeksid. Saara rea indeks on 1 ja Kalmeri rea indeks on 4. Seega sobiv järjend on [1, 4]. Saara bioloogia hinne on 5 ja Kalmeri hinne on 2. Ka need saame korraga lisada, kui kasutame järjendit.

hinded['Bioloogia'].iloc[[1, 4]] = [5, 2]

print(hinded)
>>> %Run guido.py
       Nimi  Matemaatika  Programmeerimine  Bioloogia
  0   Malle            4                 4        5.0
  1   Saara            5                 5        5.0
  2   Kusti            3                 5        NaN
  3   Aksel            4                 4        NaN
  4  Kalmer            5                 3        2.0
  5   Sulev            4                 4        5.0
  6   Guido            5                 5        2.0
  7     Ada            4                 4        3.0
  8   Moona            5                 3        4.0

 

Lisaks on võimalik iloc funktsiooniga selekteerida ka vahemik ridu nii nagu Pythonis saab viilutada järjendit [algusindeks:lõppindeks], kus lõppindeksiga element ei kuulu viilutatud vahemikku. Lisame Kusti ja Akseli bioloogia hinded. Kunsti rea indeks on 2 ja Akseli rea indeks on 3. Nende hinded on vastavalt 4 ja 5.

hinded['Bioloogia'].iloc[2:4] = [4, 5]

print(hinded)
>>> %Run guido.py
       Nimi  Matemaatika  Programmeerimine  Bioloogia
  0   Malle            4                 4        5.0
  1   Saara            5                 5        5.0
  2   Kusti            3                 5        4.0
  3   Aksel            4                 4        5.0
  4  Kalmer            5                 3        2.0
  5   Sulev            4                 4        5.0
  6   Guido            5                 5        2.0
  7     Ada            4                 4        3.0
  8   Moona            5                 3        4.0

Pandas võimaldab ka rea siltide abil andmeid selekteerida, juhul kui andmetabelis on sildid määratud. Loome hinnetetabeli, kus reasiltideks õpilaste nimed. Olgu meil kaks hinnetetabelit, millele oleme määranud reasildid index parameetrit kasutades.

sonastik_A = {'Matemaatika': [4, 5, 3, 4, 5],
            'Programmeerimine': [4, 5, 5, 4, 3]}

sonastik_B = {'Matemaatika': [4, 5, 4, 5],
            'Programmeerimine': [4, 5, 4, 3],
            'Bioloogia': [5, 2, 3, 4]}

# Sildid andmefreimide jaoks 
nimed_A = ['Malle', 'Saara', 'Kusti', 'Aksel', 'Kalmer']
nimed_B = ['Sulev', 'Guido', 'Ada', 'Moona']

hinded_A = pd.DataFrame(sonastik_A, index=nimed_A)
hinded_B = pd.DataFrame(sonastik_B, index=nimed_B)

Ühendame need kaks tabelit concat funktsiooni kasutades, kui nüüd me ei lisa ignore_index parameetrit, sest tahame kasutada silte, mitte automaatselt määratud indekseid.

hinded = pd.concat([hinded_A, hinded_B])

print(hinded)
>>> %Run guido.py
          Matemaatika  Programmeerimine  Bioloogia
  Malle             4                 4        NaN
  Saara             5                 5        NaN
  Kusti             3                 5        NaN
  Aksel             4                 4        NaN
  Kalmer            5                 3        NaN
  Sulev             4                 4        5.0
  Guido             5                 5        2.0
  Ada               4                 4        3.0
  Moona             5                 3        4.0

Lisame puudavad bioloogia hinded, kasutades vastavaid silte ehk õpilaste nimesid. Kui indeksitega selekteerimisel kasutasime iloc funktsiooni, siis siltide abil selekteerimisel kasutame loc funktsiooni. Erinevalt iloc funktsioonist, kus kasutasime nurksulgude vahel indeksit, lisame loc funktsiooni puhul nurksulgude vahele vastava sildi. Väljastame kõik Ada hinded.

print(hinded.loc['Ada'])
>>> %Run guido.py
  Matemaatika         4.0
  Programmeerimine    4.0
  Bioloogia           3.0
  Name: Ada, dtype: float64

 !  Rida tagastatakse seeriana.

Lisame Malle puuduva bioloogia hinde. Selleks peame kasutama vastavat reasilti (Malle) ja veeru pealkirja (Bioloogia), mida saame kasutada mugavalt loc funktsioonis nagu rea- ja veeruindeksit.

hinded.loc['Malle', 'Bioloogia'] = 5

Sarnaselt iloc funktsiooni kasutamisele, saame ka loc funktsiooniga valida ridu vahemikust või mitu korraga. Lisame ka ülejäänud õpilaste bioloogia hinded.

# Muudame mitu rida korraga
hinded.loc[['Saara', 'Kalmer'], 'Bioloogia'] = [2, 4]

# Muudame teatud vahemik ridu
# Vahemiku lõpp-punkt (lõppsilt) on kaasaarvatud
hinded.loc['Kusti':'Aksel', 'Bioloogia'] = [5, 5]

print(hinded)
>>> %Run guido.py
          Matemaatika  Programmeerimine  Bioloogia
  Malle             4                 4        5.0
  Saara             5                 5        2.0
  Kusti             3                 5        5.0
  Aksel             4                 4        5.0
  Kalmer            5                 3        4.0
  Sulev             4                 4        5.0
  Guido             5                 5        2.0
  Ada               4                 4        3.0
  Moona             5                 3        4.0

Veeru selekteerimine

Andmefreimis on konkreetse veeru selekteerimine lihtne. Selleks, et vastavat veergu valida, tuleb kasutada selle pealkirja nurksulgude vahel pärast andmefreimi nime. See on sarnane sõnastikust vastava võtmega väärtuse leidmisega. Väljastame kõik matemaatika hinded.

print(hinded['Matemaatika'])
>>> %Run guido.py
  0    4
  1    5
  2    3
  3    4
  4    5
  5    4
  6    5
  7    4
  8    5
  Name: Matemaatika, dtype: int64

Pandase moodulil on üks eripära, mida saab väga mugavalt ära kasutada. Nimelt on võimalik andmefreimi veergude nimesid kasutada andmefreimi nime järel pärast punkti. Väljastame programmeerimise hinded.

print(hinded.Programmeerimine)
>>> %Run guido.py
  0    4
  1    5
  2    5
  3    4
  4    3
  5    4
  6    5
  7    4
  8    3
  Name: Programmeerimine, dtype: int64

Sarnaselt rea selekteerimisega, saab iloc funktsiooniga ka veerge valida. Väljastame tabeli esimese rea, kus on õpilaste nimed. Erinevalt rea selekteerimisest, kus esimese rea väljastamiseks kasutasime  ainult reaindeksit iloc funktsioonis, siis veeru leidmiseks peab lisama ka veeruindeksi. Selleks, et väljastada kogu esimene veerg, selekteerimine kõik read, seega reaindeksina kasutame : ja vastav veeruindeks on 0.

print(hinded.iloc[:, 0])
>>> %Run guido.py
  0     Malle
  1     Saara
  2     Kusti
  3     Aksel
  4    Kalmer
  5     Sulev
  6     Guido
  7       Ada
  8     Moona
  Name: Nimi, dtype: object

Kui tahame andmeid teisest veerust kuni viimase veeruni, siis rea indeks on : ja veergude indeksid on [1:4].

# Välja arvatud on veerg indeksiga 0
print(hinded.iloc[:, 1:4])
>>> %Run guido.py
     Matemaatika  Programmeerimine  Bioloogia
  0            4                 4        5.0
  1            5                 5        5.0
  2            3                 5        4.0
  3            4                 4        5.0
  4            5                 3        2.0
  5            4                 4        5.0
  6            5                 5        2.0
  7            4                 4        3.0
  8            5                 3        4.0

Ka loc funktsiooniga on võimalik veerge valida. Selekteerime mitu veergu korraga. Väljastame matemaatika ja programmeerimise hinded. Sarnaselt iloc funktsioonile, saab loc funktsiooniga kasutada mitut silti korraga. Me soovime valida kõik read : ja veerud ['Matemaatika', 'Programmeerimine'].

print(hinded.loc[:, ['Matemaatika', 'Programmeerimine']])
>>> %Run guido.py
          Matemaatika  Programmeerimine
  Malle             4                 4
  Saara             5                 5
  Kusti             3                 5
  Aksel             4                 4
  Kalmer            5                 3
  Sulev             4                 4
  Guido             5                 5
  Ada               4                 4
  Moona             5                 3

Väljastame Sulevi ja Moona matemaatika ning programmeerimise hinded.

print(hinded.loc[['Sulev', 'Moona'], ['Matemaatika', 'Programmeerimine']])
>>> %Run guido.py
         Matemaatika  Programmeerimine
  Sulev            4                 4
  Moona            5                 3

Tingimuslik selekteerimine

Pandsega on lihtne leida andmeid, mis vastavad teatud tingimustele. Kasutame taas eelmistes näidetes kasutatud hinnetetabelit.

sonastik = {'Matemaatika': [4, 5, 3, 4, 5],
'Programmeerimine': [4, 5, 5, 4, 3]}

opilased = ['Malle', 'Saara', 'Kusti', 'Aksel', 'Kalmer']
hinded = pd.DataFrame(sonastik, index=opilased)

Leiame kõik õpilased, kes on saanud programmeerimises viie. Selleks on vaja kasutada tingimust, kus programmeerimise hinne võrdub täpselt viiega. Tingimuslause oleks selline hinded.Programmeerimine == 5. Väljastame tulemuse.

print(hinded.Programmeerimine == 5)
>>> %Run guido.py
  Malle     False
  Saara      True
  Kusti      True
  Aksel     False
  Kalmer    False
  Name: Programmeerimine, dtype: bool

Näeme, et Saara ja Kusti programmeerimise hinne on viis. Tingimusi on võimalik kasutada ka loc funktsiooniga, kus tingimus lisatakse funktsiooni väljakutsel nurksulgude vahele.

print(hinded.loc[hinded.Programmeerimine == 5])
>>> %Run guido.py
         Matemaatika  Programmeerimine
  Saara            5                 5
  Kusti            3                 5

Näeme, et tagastatakse kõik need read, mis vastavad tingimustele. Juhul, kui soovime kasutada tingimustele vastavad andmetabelit edasises analüüsis, siis on otstarbekam kasutada loc funktsiooni, aga kui on vaja saada infot tõeväärtustena, siis ei ole mõistlik loc funktsiooni kasutada.

Järgmisena kasutame veidi keerulisemat tingimust. Leiame õpilased, kes said nii programmeerimises kui ka matemaatikas viie. Vastav tingimus on (hinded.Programmeerimine == 5) & (hinded.Matemaatika == 5).

print(hinded.loc[(hinded.Programmeerimine == 5) & (hinded.Matemaatika == 5)])
>>> %Run guido.py
         Matemaatika  Programmeerimine
  Saara            5                 5

 !  loc funktsiooni tingimustes peab kasutama & (and) ja | (or) asemel ja liittingimuste puhul tuleb tingimused sulgudesse panna.

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Tarkvaraarendus. 2. trükk on loodud Eno Tõnisson, Tauno Palts, Kaarel Tõnisson, Heidi Meier, Merilin Säde, Ago Luberg, Birgy Lorenz, Einar Kivisalu, Meelis Antoi, ja Säde Mai Krusberg poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut