DataFrame

Data-analytiikan peruskirjasto on pandas. Vakiintuneen tavan mukaan käytän pandas-kirjastosta lyhennettä pd.

Pandas-kirjaston keskeinen olio on DataFrame. Analysoitavat datat avaan DataFrame-olioon ja analyysien tulostaulukot ovat enimmäkseen DataFrame-olioita.

Seuraavassa tutustutaan DataFrame-olioon yksinkertaisen esimerkkitaulukkon avulla.

In [1]:
# Tuon pandas-kirjaston
import pandas as pd

# Tallennan taulukon  tiedot sanakirjaan (dictionary)
#- dictionaryn ympärillä aina aaltosulkeet {}
#- listan ympärillä aina hakasulkeet []
raw_data = {'Tuote': ['muikkukukko', 'lanttukukko', 'lihalörtsy', 'kasvislörtsy'],
            'Varasto': [8, 10, 5, 7],
            'Hinta': [15, 12, 3, 3]}

# Luon dictionarysta DataFramen, jonka nimeksi annan df
df = pd.DataFrame(raw_data, columns = ['Tuote', 'Varasto', 'Hinta'])
# Ilman columns-parametria sarakkeet järjestyvät nimen mukaiseen aakkosjärjestykseen

# Tulostan dataframen
df
Out[1]:
Tuote Varasto Hinta
0 muikkukukko 8 15
1 lanttukukko 10 12
2 lihalörtsy 5 3
3 kasvislörtsy 7 3
In [2]:
# Dataframen rivien ja sarkkeiden määrä
df.shape
Out[2]:
(4, 3)
In [3]:
# Rivi-indeksi (dataframen vasemmassa reunassa)
df.index
Out[3]:
RangeIndex(start=0, stop=4, step=1)
In [4]:
# Sarakeindeksi
df.columns
Out[4]:
Index(['Tuote', 'Varasto', 'Hinta'], dtype='object')

Indeksihaku iloc

Voin viitata dataframen yksittäisiin soluihin indeksinumeroilla. Huomaa, että indeksinumerot alkavat numerosta 0!

In [5]:
# Lanttukukon hinta indeksihaulla (1 = lanttukukon rivi, 2 = hinta-sarake)
df.iloc[1, 2]
Out[5]:
12
In [6]:
# Tiedot lihalörtsyn riviltä (2)
df.iloc[2]
Out[6]:
Tuote      lihalörtsy
Varasto             5
Hinta               3
Name: 2, dtype: object

Haku indeksin tunnuksella loc

Voin viitata dataframen yksittäisiin soluihin indeksien tunnuksilla.

In [7]:
# Siirrän tuote-sarakkeen arvot rivi-indeksin arvoiksi
df = df.set_index('Tuote')
df
Out[7]:
Varasto Hinta
Tuote
muikkukukko 8 15
lanttukukko 10 12
lihalörtsy 5 3
kasvislörtsy 7 3
In [8]:
# Lihalörtsyn tiedot
df.loc['lihalörtsy']
Out[8]:
Varasto    5
Hinta      3
Name: lihalörtsy, dtype: int64
In [9]:
# Lihalörtsyn hinta
df.loc['lihalörtsy','Hinta']
Out[9]:
3
In [10]:
# Hintatiedot muikkukukosta lanttukukkoon
df.loc['muikkukukko' : 'lanttukukko', 'Hinta']
Out[10]:
Tuote
muikkukukko    15
lanttukukko    12
Name: Hinta, dtype: int64

Hieman laskentaa

Voin laskea dataframeen uusia sarakkeita olemassaolevien sarakkeiden pohjalta.

In [11]:
# Lasken tuotteiden varastoarvot Arvo-sarkkeeseen
df['Arvo'] = df['Varasto'] * df['Hinta']  
df
Out[11]:
Varasto Hinta Arvo
Tuote
muikkukukko 8 15 120
lanttukukko 10 12 120
lihalörtsy 5 3 15
kasvislörtsy 7 3 21
In [12]:
# Lasken summan Arvo-sarakkeesta
df['Arvo'].sum()
Out[12]:
276
In [13]:
# Kukkojen varastoarvo
df.loc['muikkukukko':'lanttukukko', 'Arvo'].sum()
Out[13]:
240
In [14]:
# Lisään %-sarakkeen (tuotteen osuus kokonaisvarastoarvosta)
df['%'] = df['Arvo'] / df['Arvo'].sum() * 100
df
Out[14]:
Varasto Hinta Arvo %
Tuote
muikkukukko 8 15 120 43.478261
lanttukukko 10 12 120 43.478261
lihalörtsy 5 3 15 5.434783
kasvislörtsy 7 3 21 7.608696
In [15]:
# Lisään dataframeen summarivin
df.loc['Yhteensä'] = df.sum()

# Esitän dataframen ilman desimaaleja
df.style.format('{:.0f}')
Out[15]:
Varasto Hinta Arvo %
Tuote
muikkukukko 8 15 120 43
lanttukukko 10 12 120 43
lihalörtsy 5 3 15 5
kasvislörtsy 7 3 21 8
Yhteensä 30 33 276 100

Rivien ja sarakkeiden vaihtaminen (transponointi)

In [16]:
# T (transpose) vaihtaa dataframen rivit ja sarakkeet
df.T.style.format('{:.0f}')
Out[16]:
Tuote muikkukukko lanttukukko lihalörtsy kasvislörtsy Yhteensä
Varasto 8 10 5 7 30
Hinta 15 12 3 3 33
Arvo 120 120 15 21 276
% 43 43 5 8 100