Pandas DataFrame je po­dat­kov­na struktura v jeziku Python, ki se lahko uporablja za ustvar­ja­nje in urejanje tabel. Razložimo strukturo po­dat­kov­ne strukture ter njene naj­po­memb­nej­še metode in lastnosti.

Kako deluje Pandas DataFrame?

Pandas Da­ta­Fra­mes so jedro knjižnice Python Pandas in omogočajo učin­ko­vi­to in pri­la­go­dlji­vo analizo podatkov v Pythonu. Pandas DataFrame je dvo­di­men­zi­o­nal­na tabelarna po­dat­kov­na struktura z ošte­vil­če­ni­mi vrsticami in ozna­če­ni­mi stolpci. Ta struktura omogoča or­ga­ni­za­ci­jo podatkov v lahko ra­zu­mlji­vi in ob­de­lo­val­ni obliki, podobno kot v programih za delo s pre­gle­dni­ca­mi, kot sta Excel ali Li­bre­O­ffi­ce. Vsak stolpec v DataFrame lahko vsebuje različne tipe podatkov Python, kar pomeni, da lahko DataFrame shranjuje he­te­ro­ge­ne podatke – na primer številčne vrednosti, nize in logične vrednosti v eni tabeli.

Tip

Pandas Da­ta­Fra­mes temeljijo na NumPy nizih, ki omogočajo učin­ko­vi­to obdelavo podatkov in izračun vrednosti. Vendar se Panda Da­ta­Fra­mes v nekaterih pogledih raz­li­ku­je­jo od NumPy po­dat­kov­nih struktur, na primer v svoji he­te­ro­ge­no­sti in številu dimenzij. Zaradi tega so NumPy po­dat­kov­ne strukture primerne za obdelavo velikih količin nu­me­rič­nih vrednosti, Panda po­dat­kov­ne strukture pa so pri­mer­nej­še za splošno obdelavo podatkov.

Struktura po­dat­kov­nih okvirjev Pandas

DataFrame ima tri glavne kom­po­nen­te: podatke, indekse vrstic in imena stolpcev. Indeks vrstice (ali preprosto indeks) edin­stve­no iden­ti­fi­ci­ra vsako vrstico. Privzeto so vrstice in­de­ksi­ra­ne s šte­vilč­ni­mi vre­dnost­mi, vendar jih je mogoče na­do­me­sti­ti z nizi. Pomembno je omeniti, da so Pandas Da­ta­Fra­mes in­de­ksi­ra­ni z ničlo, kar pomeni, da se indeksi začnejo pri 0.

Image: The structure of a Pandas DataFrame
Pandas Da­ta­Fra­mes have a tabular structure and are therefore very similar to Excel or SQL tables.
Note

Čeprav so Pandas Da­ta­Fra­mes med najbolj pri­lju­blje­ni­mi in upo­rab­ni­mi po­dat­kov­ni­mi struk­tu­ra­mi v Pythonu, niso del osnovnega jezika in jih je treba uvoziti ločeno. To storite z vrstico import pandas ali from pandas import DataFrame na začetku datoteke. Al­ter­na­tiv­no lahko uporabite import pandas as pd, če želite skli­ce­va­ti na modul s krajšim imenom (v tem primeru „pd“).

Uporaba Pandas Da­ta­Fra­mes

Pandas Da­ta­Fra­mes ponuja različne tehnike in metode za učin­ko­vi­to obdelavo, analizo in vi­zu­a­li­za­ci­jo podatkov. V na­da­lje­va­nju boste spoznali ključne koncepte in metode za ma­ni­pu­la­ci­jo podatkov z uporabo Pandas Da­ta­Fra­mes.

Kako ustvariti Pandas DataFrame

Če ste želene podatke že shranili v seznamu Python ali slovarju Python, lahko iz njih enostavno ustvarite DataFrame. Preprosto prenesite obstoječo strukturo podatkov v kon­struk­tor DataFrame z uporabo pandas.DataFrame([data]). Kako Pandas in­ter­pre­ti­ra vaše podatke, je odvisno od strukture, ki jo za­go­to­vi­te. Na primer, Pandas Da­ta­Fra­mes lahko ustvarite iz seznama Python na naslednji način:

import pandas
lists = ["Ahmed", "Beatrice", "Candice", "Donovan", "Elisabeth", "Frank"]
df = pandas.DataFrame(list)
print(df)
# Output:
#            0
# 0     	Ahmed
# 1      	Beatrice
# 2     	Candice
# 3    		Donovan
# 4  	  	Elisabeth
# 5  		Frank
python

Kot je razvidno iz zgornjega primera, lahko s pre­pro­sti­mi seznami ustvarite le po­dat­kov­ne okvire z enim samim, ne­oz­na­če­nim stolpcem. Zato je pri­po­ro­člji­vo, da po­dat­kov­ne okvire ustvarite iz slovarjev, ki vsebujejo sezname. Ključi se razlagajo kot imena stolpcev, seznami pa kot povezani podatki. To ponazarja naslednji primer:

import pandas
datA = {
    'Name': ['Arthur', 'Bruno', 'Christoph'],
    'Age': [34, 30, 55],
    'Income': [75000.0, 60000.5, 90000.3],
}
df = pandas.DataFrame(data)
print(df)
# Output:
#         Name  Age   Income
# 0     Arthur     34  75000.0
# 1      Bruno     30  60000.5
# 2  Christoph     55  90000.3
python

S to metodo ima DataFrame takoj želeno obliko in željene naslove. Če pa se ne želite zanašati na vgrajene po­dat­kov­ne strukture Python, lahko podatke naložite tudi iz zunanjega vira, na primer iz datoteke CSV ali po­dat­kov­ne zbirke SQL. Preprosto pokličite ustrezno funkcijo Pandas:

import pandas
import sqlalchemy
# DataFrame of CSV:
csv = pandas.read_csv("csv-data/files.csv")
# DataFrame of SQL:
engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
sql = pandas.read_sql_query('SELECT * FROM table', engine)
python

Da­ta­Fra­mes csv in sql v zgornjem primeru zdaj vsebujeta vse podatke iz data.csv in SQL tabele table. Pri ustvar­ja­nju DataFrame iz zunanjega vira lahko določite dodatne po­drob­no­sti, na primer, ali naj se številčni indeksi vključijo v DataFrame ali ne. Več o dodatnih ar­gu­men­tih obeh funkcij lahko izveste na uradni strani do­ku­men­ta­ci­je Pandas DataFrame.

Tip

Da bi ustvarili Pandas DataFrame iz SQL tabele, morate uporabiti Pandas v povezavi z Python SQL modulom, kot je SQLAl­che­my. Vzpo­sta­vi­te povezavo z bazo podatkov z izbranim SQL modulom in jo prenesite na read_sql_query().

Kako prikazati podatke v Pandas Da­ta­Fra­mes

S Pandas Da­ta­Fra­mes lahko prikažete ne le celotno tabelo, ampak tudi posamezne vrstice in stolpce. Izberete lahko določene vrstice in stolpce, ki jih želite prikazati. Naslednji primer prikazuje, kako prikazati posamezne ali več vrstic in stolpcev:

# Output 0-th line
print(df.loc[0])
# Output lines 3 to 6
print(df.loc[3:6])
# Output lines 3 and 6
print(df.loc[[3, 6]])
# Output "Occupation" column
print(df["Occupation"])
# Output "Occupation" and "Age" columns
print(df[["Occupation", "Age"]])
# Selection of multiple rows and columns
print(df.loc[[3, 6], ['Occupation', 'Age']])
python

V primeru se sklic na stolpec izvede z uporabo njegovega imena v enojnih oklepajih, podobno kot pri dostopu do vrednosti v slovarjih Python. Nasprotno pa se atribut loc uporablja za sklic na vrstice. Z loc lahko uporabite tudi logične pogoje za fil­tri­ra­nje podatkov. Naslednji kodni blok prikazuje, kako izpisati samo vrstice, v katerih je vrednost za »starost« večja od 30:

print(df.loc[df['Age'] > 30])
python

Vendar lahko uporabite tudi atribut iloc za izbiro vrstic in stolpcev na podlagi njihovega položaja v DataFrame. Na primer, lahko prikažete celico, ki je v tretji vrstici in četrtem stolpcu:

print(df.iloc[3, 4]) 
# Output: 
# London
 
print(df.iloc[[3, 4, 6], 4]) 
# Output: 
# 3 London
# 4 Birmingham
# 6 Preston
python

Kako po­na­vlja­ti vrstice s Pandas Da­ta­Fra­mes

Pri obdelavi podatkov v Pythonu je pogosto potrebno po­na­vlja­ti vrstice Pandas Da­ta­Fra­mes, da se enaka operacija uporabi za vse podatke. Pandas za ta namen ponuja dve metodi: itertuples() in iterrows(). Vsaka metoda ima svoje prednosti in slabosti glede zmo­glji­vo­sti in upo­rab­ni­ške pri­ja­zno­sti.

Metoda iterrows() vrne niz indeksov in serij za vsako vrstico v DataFrame. Serija je po­dat­kov­na struktura Pandas ali NumPy, podobna seznamu Python, vendar ponuja boljšo zmo­glji­vost. Do po­sa­me­znih elementov v seriji lahko dostopate z imenom stolpca, kar po­e­no­sta­vi ravnanje s podatki.

Čeprav so Pandas Series učin­ko­vi­tej­ši od Pytho­no­vih seznamov, še vedno prinašajo nekaj dodatnih stroškov glede zmo­glji­vo­sti. Zato je metoda itertuples() še posebej pri­po­ro­člji­va za zelo velike Da­ta­Fra­mes. V nasprotju z iterrows(), itertuples() vrne celotno vrstico, vključno z indeksom, kot tuples, ki so zmo­glji­vej­ši od Series. S tuples lahko dostopate do po­sa­me­znih elementov z uporabo pikaste notacije, podobno kot pri dostopu do atributov objekta.

Druga pomembna razlika med serijami in nizi je, da nizi niso spre­men­lji­vi. Če torej želite ponoviti DataFrame z uporabo itertuples() in spre­me­ni­ti vrednosti, morate DataFrame re­fe­ren­ci­ra­ti z atributom at in indeksom niza. Ta atribut deluje zelo podobno kot loc. Naslednji primer ponazarja razlike med iterrows() in itertuples():

import pandas
df = pandas.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'], 
    'Age': [25, 30, 35], 
    'Income ': [70000.0, 80000.5, 90000.3]
})
for index, row in df.iterrows():
        row['Income'] += 1000
        print(f"Index: {index}, Age: {row['Age']}, Income: {row['Income']}")
for tup in df.itertuples():
        df.at[tup.Index, 'Income'] += 1000 # Change value directly in the DataFrame using at[] 
       print(f “Index: {tup.Index}, Age: {tup.Age}, Income: {df.loc[tup.Index, 'Income']}”)
# Both loops have the same output
python
Go to Main Menu