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.