In [1]:
from datetime import datetime
print(f'Päivitetty {datetime.now()}')
Päivitetty 2022-03-18 14:18:34.768719

DataFrame

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

Pandas-kirjaston keskeinen objekti on DataFrame (muistuttaa taulukkolaskennan taulukkoa). Analysoitavan datan avaan dataframeen ja analyysien tulostaulukot ovat enimmäkseen dataframeja.

Seuraavassa tutustun dataframe-objektiin yksinkertaisen esimerkkidatan avulla.

In [2]:
# Tuon data-analytiikan peruskirjaston
import pandas as pd

# Tallennan datan sanakirjaan (dictionary)
# Sanakirjan 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 sanakirjasta dataframen, jonka nimeksi annan df
# Ilman columns-parametria sarakkeet järjestyisivät nimen mukaiseen aakkosjärjestykseen
df = pd.DataFrame(raw_data, columns=['Tuote', 'Varasto', 'Hinta'])

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

Indeksihaku iloc

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

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

Haku indeksin tunnuksella loc

Voin viitata tietokehikon yksittäisiin soluihin indeksien tunnuksilla.

In [8]:
# Siirrän tuote-sarakkeen arvot rivi-indeksin arvoiksi
df = df.set_index('Tuote')
df
Out[8]:
Varasto Hinta
Tuote
muikkukukko 8 15
lanttukukko 10 12
lihalörtsy 5 3
kasvislörtsy 7 3
In [9]:
# Lihalörtsyn tiedot
df.loc['lihalörtsy']
Out[9]:
Varasto    5
Hinta      3
Name: lihalörtsy, dtype: int64
In [10]:
# Lihalörtsyn hinta
df.loc['lihalörtsy','Hinta']
Out[10]:
3
In [11]:
# Hintatiedot muikkukukosta lanttukukkoon
df.loc['muikkukukko':'lanttukukko', 'Hinta']
Out[11]:
Tuote
muikkukukko    15
lanttukukko    12
Name: Hinta, dtype: int64
In [12]:
# Tuotteiden hinnat
df.loc[:, 'Hinta']
Out[12]:
Tuote
muikkukukko     15
lanttukukko     12
lihalörtsy       3
kasvislörtsy     3
Name: Hinta, dtype: int64
In [13]:
# Jos tuloksena on indeksin lisäksi vain yhden sarakkeen tietoja, niin tulos ei ole dataframe, vaan series
# Voin kuitenkin muuttaa tuloksen dataframeksi
df.loc[:, 'Hinta'].to_frame()
Out[13]:
Hinta
Tuote
muikkukukko 15
lanttukukko 12
lihalörtsy 3
kasvislörtsy 3

Hieman laskentaa

Voin laskea dataframeen uusia sarakkeita olemassaolevien sarakkeiden pohjalta.

In [14]:
# Lasken tuotteiden varastoarvot Arvo-sarkkeeseen
df['Arvo'] = df['Varasto'] * df['Hinta']  
df
Out[14]:
Varasto Hinta Arvo
Tuote
muikkukukko 8 15 120
lanttukukko 10 12 120
lihalörtsy 5 3 15
kasvislörtsy 7 3 21
In [15]:
# Lasken summan Arvo-sarakkeesta
df['Arvo'].sum()
Out[15]:
276
In [16]:
# Kukkojen varastoarvo
df.loc['muikkukukko':'lanttukukko', 'Arvo'].sum()
Out[16]:
240
In [17]:
# Lisään %-sarakkeen (tuotteen osuus varaston kokonaisarvosta)
df['%'] = df['Arvo'] / df['Arvo'].sum() * 100
df
Out[17]:
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 [18]:
# Lisään dataframeen summarivin
df.loc['Yhteensä'] = df.sum()

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