DataFrame

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

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

In [18]:
#otan käyttöön pandas-kirjaston
import pandas as pd

#luon dictionary-tyyppisen tietorakenteen
#- 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

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

Indeksihaku iloc

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

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

Haku indeksin tunnuksella loc

Voin viitata dataframen yksittäisiin alkioihin indeksien tunnuksilla.

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

Hieman laskentaa

Voin laskea dataframeen uusia sarakkeita olemassaolevien sarakkeiden pohjalta.

In [30]:
#lasken tuotteiden varastoarvot Arvo-sarkkeeseen
df['Arvo'] = df['Varasto'] * df['Hinta']  
df
Out[30]:
Varasto Hinta Arvo
Tuote
muikkukukko 8 15 120
lanttukukko 10 12 120
lihalörtsy 5 3 15
kasvislörtsy 7 3 21
In [31]:
#lasken summan Arvo-sarakkeesta
df['Arvo'].sum()
Out[31]:
276
In [32]:
#kukkojen varastoarvo
df.loc['muikkukukko':'lanttukukko', 'Arvo'].sum()
Out[32]:
240
In [33]:
#lisään %-sarakkeen (tuotteen osuus kokonaisvarastoarvosta)
df['%'] = df['Arvo']/df['Arvo'].sum()*100
df
Out[33]:
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 [34]:
#lisään dataframeen summarivin
df.loc['Yhteensä'] = df.sum()

#esitän dataframen ilman desimaaleja
df.style.format('{:.0f}')
Out[34]:
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 [35]:
#T (transpose) vaihtaa dataframen rivit ja sarakkeet
df.T.style.format('{:.0f}')
Out[35]:
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