Izdvajanje kolona i redova¶
U prethodnom delu lekcije smo ustanovili da se u promenljivoj df nalazi tabela. Informacije o strukturi te tabele možemo dobiti pomoću df.info():
Na prethodnoj slici, između ostalog, vidimo sledeće:
① struktura podataka u kojoj se pamti tabela se zove DataFrame,
② data frame ima 10 redova koji su označeni od 0 do 9,
③ data frame ima 3 kolone,
④ kolone Temperatura_C i Vlažnost su tipa int64, što znači da su u tim kolonama celi brojevi,
⑤ kolona Dan je tipa object, što znači da vrednosti u toj koloni nisu numeričke.
Međutim, na grafikonu iz prethodnog dela ove lekcije, dani su označeni od 1 do 10, odnosno vrednostima za koje bismo rekli da su numeričke. Da bismo razumeli zašto se tipovi kolona ipak razlikuju, pogledaćemo još jednom linije koda koje definišu ovaj data frame:
# Kreiranje podataka
data = {
"Dan": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],
"Temperatura (°C)": [22, 24, 19, 23, 25, 20, 21, 22, 24, 23],
"Vlažnost (%)": [65, 70, 75, 60, 55, 80, 78, 72, 68, 64]
}
# Kreiranje DataFrame-a
df = pd.DataFrame(data)
Primećujemo da su oznake za dane, za razliku od oznaka za temperaturu i vlažnost, stavljene pod navodnike. Samim tim, Python te vrednosti tretira kao stringove (tekstualne vrednosti), a ne kao numeričke vrednosti. Sa stringovima smo se već susretali u prethodnim lekcijama. Naime, vrednosti "1" i "2" (napisane ovako, pod navodnicima) su stringovi, isto kao što su "1. maj" i "2. maj" ili "ponedeljak" i "utorak". Drugim rečima, tekst koji sadrži samo cifre Python neće automatski prepoznati kao broj.
Međutim, ne smeta nam što se u ovom primeru vrednosti iz kolone Dan tretiraju kao stringovi, jer i ne pokušavamo da ih koristimo kao numeričke veličine, već samo kao oznake za pojedine dane.
Želimo da nam ChatGPT pomogne da izdvojimo određene kolone iz ovog data frame-a. Pri tome, želimo da započnemo novi čet. U tom slučaju, budući da ne postoje prethodne poruke na osnovu kojih bi ChatGPT mogao da izvede zaključak o izgledu našeg data frame-a, potrebno je da u zahtevu najpre pružimo tu informaciju.
Rezultat koji smo dobili pomoću df.info() sasvim odgovara toj svrsi, jer sadrži sve potrebne informacije i ima doslednu strukturu. Uz to, pretpostavljamo da se relativno često koristi za pružanje informacija o data frame-u. Imajući sve to u vidu, možemo očekivati da ChatGPT ume da interpretira formu koju generiše df.info(). Štaviše, videćemo u nastavku da se ChatGPT dobro snalazi i kada mu rezultat od df.info() priložimo kao sliku ekrana.
Za slikanje ekrana na operativnom sistemu Windows 11 možemo koristiti Snipping Tool, koji se pokreće kombinacijom tastera Win + Shift + S. Na sledećoj slici vidimo kako je u okviru Snipping Tool-a selektovan pravougaoni deo ekrana koji će biti uslikan.
Selektovan deo ekrana je obuhvatio i kod df.info(), čime je data informacija o nazivu promenljive, kao i o načinu na koji je rezultat nastao.
Slikan deo ekrana možemo da pejstujemo u poruku ChatGPT-u i da zatim u okviru iste poruke postavimo naše pitanje:
Kako da izdvojim samo kolone dan i temperatura
To u ChatGPT-u izgleda ovako:
ChatGPT vam može dati sledeći odgovor:
U ovom odgovoru ChatGPT-a, sledeći izraz je ključan:
df[['Dan', 'Temperatura_C']]
Pomoću ovog izraza izdvajamo kolone dan i temperatura, a kao rezultat dobijamo novi data frame koji sadrži samo te dve kolone. Skrećemo vam pažnju na to da su u izrazu upotrebljeni tačni nazivi kolona, iako smo ChatGPT-u napisali da želimo kolone „dan i temperatura” − to znači da je ChatGPT uspeo da iskoristi informacije iz df.info() koje smo preneli slikanjem dela ekrana.
Međutim, pažnju su vam verovatno privukle duple uglaste zagrade. U ovom izrazu spoljašnje i unutrašnje zagrade imaju različitu namenu. Spoljašnje uglaste zagrade obično označavaju da nešto izdvajamo iz data frame-a:
df[šta izdvajamo]
To što izdvajamo je u ovom slučaju određeno listom koja je oivičena svojim uglastim zagradama i sadrži dva stringa:
['Dan', 'Temperatura_C']
Dakle, spoljašnje uglaste zagrade označavaju da se iz df nešto izdvaja, a unutrašnje oivičavaju listu naziva kolona koje treba izdvojiti.
Kada ovaj izraz kopiramo u Jupyter ćeliju i izvršimo, dobićemo:
Naučili smo da kreiramo novi data frame u kojem je izdvojen određen broj kolona.
Sada ćemo pitati ChatGPT kako da izdvojimo pojedinačnu kolonu. U nastavku istog četa, ChatGPT-u postavljamo sledeće pitanje:
a kako da izdvojim samo kolonu temperatura
ChatGPT vam može dati sledeći odgovor:
Primećujemo da su nam u odgovoru ponuđena dva načina za izdvajanje pojedinačne kolone, odnosno dva izraza. Pomoću prvog izraza kreiramo zasebnu kolonu:
df['Temperatura_C']
Dok pomoću drugog kreiramo data frame sa jednom kolonom:
df[['Temperatura_C']]
Obe varijante prate već pomenutu opštu formu izraza:
df[šta izdvajamo]
S tom razlikom što u prvom slučaju naziv kolone zadajemo kao string: 'Temperatura_C', dok u drugom slučaju naziv kolone zadajemo kao listu u kojoj je taj isti string jedini element: ['Temperatura_C']. Na sledećoj slici je prikazan rezultat izvršavanja i prvog i drugog izraza u Jupyter svesci.
Na prethodnoj slici možete da vidite razliku u prikazu zasebne kolone i iste te kolone u okviru data frame-a. U odgovoru koji je dao ChatGPT primetili ste i da se struktura podataka u kojoj se pamti zasebna kolona zove Series. Naime, za razliku od strukture podataka DataFrame, koja pamti celu tabelu, Series pamti samo zasebnu kolonu.
Izdvajanje (filtriranje) redova¶
U nastavku postojećeg četa, ChatGPT-u zadajemo sledeći upit:
Sada želim da izdvojim redove gde je temperatura veća od 20 i vlažnost veća od 70
ChatGPT vam može dati sledeći odgovor:
U ovom odgovoru ChatGPT-a, sledeći izraz je ključan:
df[(df['Temperatura_C'] > 20) & (df['Vlažnost'] > 70)]
Kao što možete primetiti, opšta forma izraza koju koristimo za izdvajanje redova ista je kao i za izdvajanje kolona:
df[šta izdvajamo]
Pri čemu se za izdvajanje redova koriste logički uslovi. Prilikom postavljanja logičkih uslova, karakteristično je da se navode cele kolone, kao na primer df['Temperatura_C'] ili df['Vlažnost']:
(df['Temperatura_C'] > 20) & (df['Vlažnost'] > 70)
Osnovni logički uslovi su relacione operacije. U logičkom uslovu da je temperatura veća od 20, izdvajamo kolonu Temperatura_C i koristimo relacioni operator „veće”:
df['Temperatura_C'] > 20
U logičkom uslovu da je vlažnost veća od 70, izdvajamo kolonu Vlažnost i ponovo koristimo relacioni operator „veće”:
df['Vlažnost'] > 70
Logičke uslove dalje možemo povezivati logičkim operatorima, kao što su & (logičko „i”) i | (logičko „ili”). Ovako povezane logičke uslove nazivamo složenim logičkim uslovima. U našem slučaju, želimo da povežemo:
(uslov da je temperatura veća od 20) & (uslov da je vlažnost veća od 70)
Zagrade su potrebne kako bismo bili sigurni da se relacioni i logički operatori primenjuju u pravilnom redosledu. Kada pravilno primenimo relacione i logičke operatore, povezujući dva logička uslova u jedan složeni, dolazimo do gore prikazanog uslova iz odgovora ChatGPT-a.
Kada sve pravilno povežete, dobijate početni izraz u kojem imate df[] unutar df[]. Ako ste pažljivo pratili lekciju, mogli ste da zaključite da unutrašnji df[] izdvaja kolone koje učestvuju u logičkom uslovu, a da spoljašnji df[] izdvaja redove na osnovu logičkog uslova.
Izvršićemo u Jupyter ćeliji izdvajanje redova po složenom uslovu koji smo tražili na početku:
Zatim ćemo izvršiti i izdvajanje redova samo po uslovu za temperaturu:
Izdvajanje redova često zovemo filtriranjem. Kao što ste mogli da primetite, taj termin se javlja i u odgovoru ChatGPT-a. Dakle, naučili smo da izdvajamo određene kolone data frame-a i da filtriramo redove po logičkim uslovima u kojima učestvuju vrednosti kolona.