Uvod u Python Pandas

Drugi deo

Tipovi podataka i vrednosti koje nedostaju

Svaka kolona podataka u pandas DataFrame-u ima tip podatka. Ovo je vrlo sličan koncept tipovima podataka u Python-u. Kao što svaki Python objekat ima tip, svaka kolona ima tip podataka.

Tipovi podataka koji se često pojavljuju u DataFrames-u su:

  • boolean - samo dve moguće vrednosti, True ili False
  • integer - celi brojevi
  • float - decimalni brojevi
  • object - obično nizovi, ali može sadržati bilo koji objekat
  • datetime - datum i vreme

Više o tipu object

Kolone objekata mogu da sadrže cele brojeve, decimalne brojeve ili čak složene tipove kao što su liste ili rečnici. Bilo šta može biti sadržano u kolonama objekata. Kada vidite da je kolona tipa object trebalo bi da očekujete da će vrednosti biti stringovi. Pandas ne pruža svojim korisnicima određeni tip podataka za stringove, tako da ako imate stringove u svojim kolonama, tip podataka će biti object.

Važnost poznavanja tipa podataka

Poznavanje tipa podataka svake kolone vašeg pandas DataFrame-a je veoma važno. Glavni razlog za to je što će svaka vrednost u svakoj koloni biti istog tipa. Na primer, ako izaberete jednu vrednost iz kolone koja ima celobrojni tip podataka, onda vam je zagarantovano da je i ova vrednost ceo broj. Poznavanje tipa podataka kolone je jedan od najosnovnijih delova znanja o vašem DataFrame-u.

NaN, None i NaT

Pandas različito predstavlja vrednosti koje nedostaju na osnovu tipa podataka kolone.

  • NaN (not a number) tehnički je tip podataka float
  • None koristi se za nedostajuće vrednosti u kolonama tipa object
  • NaT (not a time) koristi se za nedostajuće vrednosti u kolonama datuma i vremena

Nedostajuće vrednosti za svaki tip podataka

  • boolean i integer - Ne postoji prikaz za nedostajuće vrednosti za logičke i celobrojne kolone.

  • floats - Koristi samo NaN kao vrednost koja nedostaje.

  • object – Kolone tipa object mogu da sadrže bilo koji Python objekat tako da se sva tri nedostajuća prikaza vrednosti mogu pojaviti u ovim kolonama, ali obično će biti ili NaN ili None.

  • datetime - Koristi samo NaT kao vrednost koja nedostaje.

Pronalaženje tipova podataka svake kolone

Atribut DataFrame dtypes (nije metod) vraća tip podataka svake kolone. Vraćeni podaci su Series sa nazivima kolona koji su sada u indeksu i tipom podataka kao vrednostima.

In [1]:
import pandas as pd

df1 = pd.read_csv('../datasets/data.csv')

df1.head()
Out[1]:
Duration Pulse Maxpulse Calories
0 60 110 130 409.1
1 60 117 145 479.0
2 60 103 135 340.0
3 45 109 175 282.4
4 45 117 148 406.0
In [2]:
df1.dtypes
Out[2]:
Duration      int64
Pulse         int64
Maxpulse      int64
Calories    float64
dtype: object

Dobijanje više metapodataka

Metapodaci se mogu definisati kao podaci o podacima. Tip podataka svake kolone je primer metapodataka. Broj redova i kolona je još jedan deo metapodataka. Atribut shape vraća niz celih brojeva (broj redova, broj kolona).

In [3]:
df1.shape
Out[3]:
(169, 4)

Atribut size vraća ukupan broj vrednosti (broj kolona pomnožen brojem redova) u DataFrame-u.

In [4]:
df1.size
Out[4]:
676

Metoda info pored tipa podatka svake kolone, pokazuje broj vrednosti koje nedostaju u svakoj koloni zajedno sa više informacija kao što su:

  • Tip objekta (uvek DataFrame)
  • Tip indeksa i broj redova
  • Broj kolona
  • Tipovi podataka svake kolone i broj kolona koje nedostaju (tzv. non-null)
  • Broj učestalosti svih tipova podataka
  • Ukupna upotreba memorije
In [5]:
df1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 169 entries, 0 to 168
Data columns (total 4 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Duration  169 non-null    int64  
 1   Pulse     169 non-null    int64  
 2   Maxpulse  169 non-null    int64  
 3   Calories  164 non-null    float64
dtypes: float64(1), int64(3)
memory usage: 5.4 KB

Vežba 1

Odredi tip objekta koji vraća atribut dtypes.

In [ ]:
 
In [ ]:
 

Vežba 2

Odredi tip objekta koji vraća atribut shape.

In [ ]:
 
In [ ]:
 

Vežba 3

Koji tip objekta vraća metod info?

In [ ]:
 
In [ ]:
 

Indeksiranje

Indeks DataFrame-a obezbeđuje oznaku za svaki od redova. Ako nije eksplicitno navedeno, indeks će biti niz uzastopnih celih brojeva koji počinju od 0.

U ovom delu ćemo postaviti jednu od kolona DataFrame-a kao novi indeks tako da svakom redu daje značajniju oznaku.

In [6]:
import pandas as pd
dfMy = pd.read_csv('../datasets/nutrients_csvfile.csv')
dfMy.head()
Out[6]:
Food Measure Grams Calories Protein Fat Sat.Fat Fiber Carbs Category
0 Cows' milk 1 qt. 976 660 32 40 36 0 48 Dairy products
1 Milk skim 1 qt. 984 360 36 t t 0 52 Dairy products
2 Buttermilk 1 cup 246 127 9 5 4 0 13 Dairy products
3 Evaporated, undiluted 1 cup 252 345 16 20 18 0 24 Dairy products
4 Fortified milk 6 cups 1,419 1,373 89 42 23 1.4 119 Dairy products

Postavljanje indeksa pomoću set_index

Moguće je podesiti indeks nakon čitanja podataka metodom set_index. Prosledite samo ime kolone koju želite da koristite kao indeks.

In [7]:
import pandas as pd
dfMy = pd.read_csv('../datasets/nutrients_csvfile.csv')

dfMy= dfMy.set_index('Food') 
dfMy.head()
Out[7]:
Measure Grams Calories Protein Fat Sat.Fat Fiber Carbs Category
Food
Cows' milk 1 qt. 976 660 32 40 36 0 48 Dairy products
Milk skim 1 qt. 984 360 36 t t 0 52 Dairy products
Buttermilk 1 cup 246 127 9 5 4 0 13 Dairy products
Evaporated, undiluted 1 cup 252 345 16 20 18 0 24 Dairy products
Fortified milk 6 cups 1,419 1,373 89 42 23 1.4 119 Dairy products
In [8]:
import pandas as pd
dfMy = pd.read_csv('../datasets/nutrients_csvfile.csv')
"""
set_index pravi potpuno novu kopiju podataka i ne menja pozivni DataFrame. 
Ako pokrenemo iste komande, ali ne dodelimo rezultat metoda set_index, DataFrame neće biti promenjen. 
"""
dfMy.set_index('Food') 
dfMy.head()
Out[8]:
Food Measure Grams Calories Protein Fat Sat.Fat Fiber Carbs Category
0 Cows' milk 1 qt. 976 660 32 40 36 0 48 Dairy products
1 Milk skim 1 qt. 984 360 36 t t 0 52 Dairy products
2 Buttermilk 1 cup 246 127 9 5 4 0 13 Dairy products
3 Evaporated, undiluted 1 cup 252 345 16 20 18 0 24 Dairy products
4 Fortified milk 6 cups 1,419 1,373 89 42 23 1.4 119 Dairy products

Atributi index, columns, i values

DataFrame se sastoji od tri komponente – indeksa, kolona i podataka. Moguće je izdvojiti svaku komponentu i dodeliti je sopstvenoj promenljivoj.

In [9]:
import pandas as pd
dfMy = pd.read_csv('../datasets/nutrients_csvfile.csv')
dfMy.head(3)
Out[9]:
Food Measure Grams Calories Protein Fat Sat.Fat Fiber Carbs Category
0 Cows' milk 1 qt. 976 660 32 40 36 0 48 Dairy products
1 Milk skim 1 qt. 984 360 36 t t 0 52 Dairy products
2 Buttermilk 1 cup 246 127 9 5 4 0 13 Dairy products
In [10]:
indeksi = dfMy.index
kolone = dfMy.columns
vrednosti = dfMy.values

Prikaz izdvojenih objekata

In [11]:
indeksi
Out[11]:
RangeIndex(start=0, stop=335, step=1)
In [12]:
kolone
Out[12]:
Index(['Food', 'Measure', 'Grams', 'Calories', 'Protein', 'Fat', 'Sat.Fat',
       'Fiber', 'Carbs', 'Category'],
      dtype='object')
In [13]:
vrednosti
Out[13]:
array([["Cows' milk", '1 qt.', '976', ..., '0', '48', 'Dairy products'],
       ['Milk skim', '1 qt.', '984', ..., '0', '52', 'Dairy products'],
       ['Buttermilk', '1 cup', '246', ..., '0', '13', 'Dairy products'],
       ...,
       ['Root beer', '12 oz.', '346', ..., '0', '35',
        'Drinks,Alcohol, Beverages'],
       ['Coffee', '1 cup', '230', ..., '0', '1',
        'Drinks,Alcohol, Beverages'],
       ['Tea', '1 cup', '230', ..., '0', '1',
        'Drinks,Alcohol, Beverages']], dtype=object)