python pandas voorbeelden basis tutorial

Het Python Pandas package is een open source library met data analyse functionaliteit die gebruikt wordt binnen de programmeertaal Python. Pandas is het meestgebruikte package door data scientists en het is essentieel om te beheersen als je aan data analyse of data science vraagstukken werkt.

In deze tutorial vind je een overzicht van de basisfunctionaliteit van Pandas. We gaan in op:

Python Pandas installeren

Allereerst is het van belang om Python te installeren voordat je met Pandas aan de slag kunt.

Pandas installeren kan op verschillende manieren. De ontwikkelaars van het packages raden aan om Anaconda te gebruiken. Anaconda kun je gebruiken om het beheer van al je packages te vereenvoudigen. Zo kun je met Anaconda gemakkelijk duizenden packages installeren en zorgt Anaconda er voor dat packages up-to-date zijn en dat afhankelijkheden correct geconfigureerd blijven.

Als je Anaconda installeert dan heb je direct toegang tot o.a. Pandas. Lees hier hoe je Anaconda installeert op:

Pandas is standaard bij de installatie in begrepen, maar packages kunnen apart geïnstalleerd worden met het volgende commando:

conda install pandas

Voor wie geen Anaconda wil gebruiken is het mogelijk om Python Pandas te installeren via pip. Je voert dan in de command prompt (Windows) of terminal (Mac) de volgende code in:

pip install pandas

Pandas importeren

Wij adviseren om Jupyter Notebook te installeren zodat je mee kunt doen met de voorbeelden.

Het is gebruikelijk om zowel Numpy als Pandas te importeren. Voor een deel overlapt de functionaliteit van deze packages, maar in veel data analyses heb je specifieke functionaliteit van Numpy nodig als aanvulling op de Pandas functionaliteit.

In [1]:

import numpy as np
import pandas as pd

Pandas Series en DataFrames

Binnen Pandas zitten data in een Series of een DataFrame. Een series is een ééndimensionale reeks met waarden. Een series kan ieder datatype bevatten, ook door elkaar heen. De reeks krijgt labels meegegeven door Pandas, deze labels wordt de 'index' genoemd.

In [2]:

een_tot_tien = pd.Series(range(1,11))
print(een_tot_tien)

0     1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
dtype: int64

In bovenstaand voorbeeld genereren we een reeks van één tot tien. Je kunt zien dat de index de waarden nul tot negen bevat.

Een DataFrame is een tweedimensionale datastructuur met rijen en kolommen. Je kunt dit het best vergelijken met een Excel-sheet. Ook binnen een DataFrame is het mogelijk met verschillende soorten data te werken.

Voor deze blog maken we zelf een kleine dataset met tien personen waarvan we de lengt, het geslacht, en de geboortedatum kennen.

In [3]:

lengtes = 5 * np.random.randn(10)+170
geslacht = ["vrouw", "vrouw", "man", "vrouw", "vrouw", "vrouw", "man", "man", "vrouw", "vrouw"]
geboortedatum = np.array(['1957-01-01', '1975-03-02', '1991-07-03', '1939-11-04',
'1929-01-05', '1995-12-06', '1975-03-02', '1975-03-02', '1939-11-04', '2000-04-01'], dtype='datetime64[ns]')

Je kunt een nieuw DataFrame maken met pd.DataFrame(). In ons geval stellen we de dataset samen met behulp van een dictionary waardoor we direct kolomnamen kunnen meegeven. Het is mogelijk om de index andere waarden mee te geven met de parameter 'index' en kolomnamen kunnen meegegeven worden met parameter 'columns'.

In [4]:

df = pd.DataFrame({
"geboortedatum" : geboortedatum,
"geslacht" : geslacht,
"lengte" : lengtes
})

print(df)
print(df.dtypes)

  geboortedatum geslacht      lengte
0 1957-01-01 vrouw 164.922945
1 1975-03-02 vrouw 165.122392
2 1991-07-03 man 166.654339
3 1939-11-04 vrouw 174.941112
4 1929-01-05 vrouw 174.348120
5 1995-12-06 vrouw 172.129023
6 1975-03-02 man 163.659517
7 1975-03-02 man 173.502233
8 1939-11-04 vrouw 176.749675
9 2000-04-01 vrouw 168.478365
geboortedatum datetime64[ns]
geslacht object
lengte float64
dtype: object

Je ziet dat we een klein DataFrame hebben gemaakt met behulp van Pandas. We zien dat het frame verschillende datatypes bevat in de verschillende kolommen. In Numpy is het niet mogelijk om in één ndarray met verschillende datatypes te werken.

Om een vlugge indruk te krijgen van een dataset kun je df.info() en df.describe() gebruiken.

In [5]:

print(df.info())
print(df.describe())

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 3 columns):
geboortedatum 10 non-null datetime64[ns]
geslacht 10 non-null object
lengte 10 non-null float64
dtypes: datetime64[ns](1), float64(1), object(1)
memory usage: 320.0+ bytes
None
lengte
count 10.000000
mean 170.050772
std 4.818132
min 163.659517
25% 165.505379
50% 170.303694
75% 174.136648
max 176.749675

We zien dat df.info() informatie geeft over het DataFrame op het gebied van de kolommen, de Python data types, het aantal (missende) waarden, en de grootte van de dataset. En df.describe() geeft een aantal veelgebruikte berekeningen voor alle numerieke kolommen. In het geval van onze dataset is dat alleen de lengte-kolom.

Met vertrouwen waardevolle inzichten halen uit data? Schrijf je in voor een van onze trainingen.



Selecteren van data uit een DataFrame op diverse manieren

Basis
Als je een DataFrame hebt gemaakt of geopend dan wil je over het algemeen een snelle indruk krijgen van de dataset. Je kunt in Pandas de eerste of juist de laatste rijen selecteren met df.head() en df.tail(). Daarnaast zul je vaak de index-reeks of kolomnamen nodig hebben. Ook deze kun je eenvoudig selecteren.

In [6]:

print(df.head(2))
print(df.tail(2))
print(df.index)
print(df.columns)

  geboortedatum geslacht      lengte
0 1957-01-01 vrouw 164.922945
1 1975-03-02 vrouw 165.122392
geboortedatum geslacht lengte
8 1939-11-04 vrouw 176.749675
9 2000-04-01 vrouw 168.478365
RangeIndex(start=0, stop=10, step=1)
Index(['geboortedatum', 'geslacht', 'lengte'], dtype='object')

Selectie op basis van label
In Pandas kun je kolommen en rijen of gedeeltes daarvan op twee manieren selecteren: door de labels te specificeren of door de positie te specificeren. Laten we beginnen met het selecteren van data op basis van labels. Dit doe je met df.loc[rij(en), kolom(men)]. Tussen de blokhaken geeft je de rij(en) en kolom(men) aan om te selecteren.

In [8]:

print(df.loc[0,'lengte'])
print(df.loc[0:3,'geslacht'])
print(df.loc[8:,'geslacht':])

164.92294489526012
0 vrouw
1 vrouw
2 man
3 vrouw
Name: geslacht, dtype: object
geslacht lengte
8 vrouw 176.749675
9 vrouw 168.478365

We maken drie selecties. Allereerst selecteren we de lengte van de eerste persoon. In de tweede selectie maken we gebruik van 'slicing' waarmee we vier rijen tegelijk selecteren met "0:3". In de laatste selectie maken we gebruik van slicing voor zowel de rijen als de kolommen. "8:" betekent 'ik wil alle rijen selecteren vanaf indexnummer 8'.

Selectie op basis van positie
We kunnen exact dezelfde selecties maken op basis van positie in het DataFrame als we df.iloc gebruiken in plaats van df.loc.

In [9]:

print(df.iloc[0,2])
print(df.iloc[0:3,1])
print(df.iloc[8:,1:])

164.92294489526012
0 vrouw
1 vrouw
2 man
Name: geslacht, dtype: object
geslacht lengte
8 vrouw 176.749675
9 vrouw 168.478365

Selectie op basis van logische criteria
We kunnen logica in onze selecties bouwen met "boolean indexing". Als we bijvoorbeeld alleen de vrouwen uit de dataset willen selecteren dan maken we eerst een boolean series.

In [10]:

vrouwen_bool = df['geslacht'] == "vrouw"
print(vrouwen_bool)

0     True
1 True
2 False
3 True
4 True
5 True
6 False
7 False
8 True
9 True
Name: geslacht, dtype: bool

Deze series gebruiken we vervolgens om de rijen uit de dataset te selecteren waardoor de bool "True" is.

In [11]:

df_vrouwen = df[vrouwen_bool]
print(df_vrouwen)

  geboortedatum geslacht      lengte
0 1957-01-01 vrouw 164.922945
1 1975-03-02 vrouw 165.122392
3 1939-11-04 vrouw 174.941112
4 1929-01-05 vrouw 174.348120
5 1995-12-06 vrouw 172.129023
8 1939-11-04 vrouw 176.749675
9 2000-04-01 vrouw 168.478365

Op deze manier kun je op basis van logica allerlei selecties maken. We zouden bijvoorbeeld mensen die langer zijn dan 170cm kunnen selecteren met een bool lengte > 170. Je kunt deze logica ook combineren en alleen vrouwen langer dan 170cm selecteren.

In [12]:

lange_vrouwen = (df['geslacht'] == "vrouw") & (df['lengte'] > 170)
print(df[lange_vrouwen])

  geboortedatum geslacht      lengte
3 1939-11-04 vrouw 174.941112
4 1929-01-05 vrouw 174.348120
5 1995-12-06 vrouw 172.129023
8 1939-11-04 vrouw 176.749675

(standaard) berekeningen uitvoeren

Binnen Python Pandas kun je allerlei berekeningen uitvoeren op een Series of DataFrame. Met DataFrame.functie(0) pas je de functie toe op de kolommen en met DataFrame.functie(1) op de rijen. Veelgebruikte functies zijn bijvoorbeeld:

FunctieBeschrijving
countTelt het aantal niet-missende waarden
sumSom van de waarden
meanGemiddelde
medianMediaan van de waarden
minMinimum
maxMaximum
modeModus
absGeeft de absolute waarde
stdStandaardafwijking
varVariantie

Met vertrouwen waardevolle inzichten halen uit data? Schrijf je in voor een van onze trainingen.



Omgaan met missende waarden in Pandas

We voegen eerst twee missende waarden toe met Pandas voordat we dit gedeelte toelichten.

In [13]:

df.iloc[3,2] = np.nan
df.iloc[6,1] = np.nan
print(df)

  geboortedatum geslacht      lengte
0 1957-01-01 vrouw 164.922945
1 1975-03-02 vrouw 165.122392
2 1991-07-03 man 166.654339
3 1939-11-04 vrouw NaN
4 1929-01-05 vrouw 174.348120
5 1995-12-06 vrouw 172.129023
6 1975-03-02 NaN 163.659517
7 1975-03-02 man 173.502233
8 1939-11-04 vrouw 176.749675
9 2000-04-01 vrouw 168.478365

We missen nu van één persoon de lengte en van één persoon het geslacht.

Missende waarden verwijderen
Met Pandas is het mogelijk om alle rijen of kolommen met missende waarden te verwijderen. Dit doe je met DataFrame.dropna() en met parameter 'axis' kun je met waarde '0' rijen met missende waarden en met "1" kolommen met missende waarden verwijderen.

In [14]:

df_missing = df.copy()
df_geen_missing = df_missing.dropna().reset_index(drop = True)
print(df_geen_missing)

  geboortedatum geslacht      lengte
0 1957-01-01 vrouw 164.922945
1 1975-03-02 vrouw 165.122392
2 1991-07-03 man 166.654339
3 1929-01-05 vrouw 174.348120
4 1995-12-06 vrouw 172.129023
5 1975-03-02 man 173.502233
6 1939-11-04 vrouw 176.749675
7 2000-04-01 vrouw 168.478365

We zien dat we na deze bewerking met Pandas nog acht rijen over hebben. Dat klopt met onze verwachting, omdat er twee rijen met missende waarde in het DataFrame zaten.

Missende waarden opvullen
In sommige situaties is het wenselijk om missende waarden op te vullen in plaats van de totale observaties te verwijderen. Met DataFrame.fillna() is het mogelijk om missende waarden op te vullen. Je kunt een standaardwaarde meegeven voor missende waarden, maar je kunt het gat ook opvullen op een andere manier. Zo kun je bijvoorbeeld het gemiddelde, de modus, of de mediaan gebruiken.

In [15]:

df_missing = df.copy()
df['geslacht'] = df['geslacht'].astype('category')
df_missing['geslacht'] = df['geslacht'].fillna(df['geslacht'].mode()[0])
df_missing['lengte'] = df['lengte'].fillna(df['lengte'].mean())
df_missing

Out[15]:

geboortedatumgeslachtlengte
01957-01-01vrouw164.922945
11975-03-02vrouw165.122392
21991-07-03man166.654339
31939-11-04vrouw169.507401
41929-01-05vrouw174.348120
51995-12-06vrouw172.129023
61975-03-02vrouw163.659517
71975-03-02man173.502233
81939-11-04vrouw176.749675
92000-04-01vrouw168.478365

In bovenstaand voorbeeld vullen we ter illustratie het geslacht aan op basis van de modus en de lengte op basis van het gemiddelde.

Tekst manipuleren in Pandas

Binnen Pandas is het mogelijk om op allerlei manieren strings (tekst) te bewerken. Je past een dergelijke bewerking op een Series of kolom uit een dataframe toe als volgt: Series.str.functie(). Hier volgen enkele voorbeelden voor de kolom 'geslacht'.

In [16]:

print(df['geslacht'].str.upper())
print(df['geslacht'].str.get(0))
print(df['geslacht'].str.len())
print(df['geslacht'].str.startswith("v"))

0    VROUW
1 VROUW
2 MAN
3 VROUW
4 VROUW
5 VROUW
6 NaN
7 MAN
8 VROUW
9 VROUW
Name: geslacht, dtype: object
0 v
1 v
2 m
3 v
4 v
5 v
6 NaN
7 m
8 v
9 v
Name: geslacht, dtype: object
0 5.0
1 5.0
2 3.0
3 5.0
4 5.0
5 5.0
6 NaN
7 3.0
8 5.0
9 5.0
Name: geslacht, dtype: float64
0 True
1 True
2 False
3 True
4 True
5 True
6 NaN
7 False
8 True
9 True
Name: geslacht, dtype: object

We tonen vier verschillende bewerkingen. Ten eerste transformeren we alle tekst naar hoofdletters, vervolgens pakken we de eerste letter van iedere string, en tenslotte tellen we de lengte van de string.

Er zijn enorm veel mogelijkheden binnen Python Pandas, waarvan we er hier enkele opsommen:

MethodeOmschrijving
split()Splitst strings op een te kiezen scheidingsteken (standaard een spatie)
get()Geeft het i-de element uit de string
contains()Geeft een boolean array die aangeeft of iedere string een bepaald patroon of regular expression bevat
replace()Vervangt patronen of woorden met een andere string
repeat()Herhaalt de string i keer
pad()Voeg spaties toe voor en/ of achter de string
count()Telt hoe vaak een patroon voorkomt
findall()Maakt een lijst van alle keren dat een patroon binnen een string voorkomt
strip()Verwijdert spaties aan de linker en rechter kant van de string
lower()Maakt lowercase letters van alle tekens
upper()Transformeert tekens naar hoofdletters

Databronnen samenvoegen

Je zult als data scientist vaak werken met data uit verschillende bronnen. Je wilt deze data dan zo samenvoegen dat je één DataFrame krijgt waar je berekeningen op kunt uitvoeren. Je kunt hier pd.concat([databron1, databron2]) voor gebruiken. Met de 'axis' parameter kun je aangeven of de datasets op elkaar of naast elkaar moeten komen. In onderstaand voorbeeld voegen we een nieuwe rij toe aan ons DataFrame.

In [17]:

gewicht = pd.Series([75, 88, 57, 77, 83, 77, 66, 51, 95, 71], dtype=int, name="gewicht")

df = pd.concat([df, gewicht], axis = 1)
print(df)

  geboortedatum geslacht      lengte  gewicht
0 1957-01-01 vrouw 164.922945 75
1 1975-03-02 vrouw 165.122392 88
2 1991-07-03 man 166.654339 57
3 1939-11-04 vrouw NaN 77
4 1929-01-05 vrouw 174.348120 83
5 1995-12-06 vrouw 172.129023 77
6 1975-03-02 NaN 163.659517 66
7 1975-03-02 man 173.502233 51
8 1939-11-04 vrouw 176.749675 95
9 2000-04-01 vrouw 168.478365 71

Je komt niet altijd uit met de functionaliteit van pd.concat(). Met pd.merge() kunnen bronnen op geavanceerdere manieren samengevoegd worden.

Draaitabellen in Pandas

Net als in Excel heb je de mogelijkheid om met Python Pandas draaitabellen te maken. Dit doe je met pd.pivot_table(). Binnen deze functie kun je de waarden, kolommen, en rijen specificeren met parameters. Daarnaast kun je aangeven wat je met de waarden wilt doen (denk aan optellen, tellen, gemiddelde, etc.).

In [18]:

print(pd.pivot_table(df, values='gewicht', columns='geslacht', aggfunc='mean'))
print(pd.pivot_table(df, values='gewicht', index=['geslacht', 'geboortedatum'], aggfunc='mean'))

geslacht   man      vrouw
gewicht 54.0 80.857143
gewicht
geslacht geboortedatum
man 1975-03-02 51
1991-07-03 57
vrouw 1929-01-05 83
1939-11-04 86
1957-01-01 75
1975-03-02 88
1995-12-06 77
2000-04-01 71

Met onze eerste draaitabel vinden we dat we een dataset hebben met relatief zware vrouwen en lichte mannen. Dat zegt op deze sample size natuurlijk niet zo veel. In de tweede draaitabel gebruiken we twee kolommen als input voor de index van de draaitabel.

Pandas data visualisatie mogelijkheden

Binnen Pandas is het mogelijk om allerlei visualisaties te produceren. Pandas maakt onder de motorkap gebruik van Matplotlib (een visualisatie package). Met df.plot(kind=soort_grafiek) kunnen veel grafieken geplot worden. Op de plek van 'soort_grafiek' kun je het grafiektype ingeven. Zo kun je eenvoudig scatterplots, bar charts, pie charts, boxplots, en vele andere visualisaties maken.

In [21]:

print(df.plot.scatter(x='lengte', y='gewicht'))

AxesSubplot(0.125,0.125;0.775x0.755)

In [20]:

print(df['lengte'].plot(kind='box'))

AxesSubplot(0.125,0.125;0.775x0.755)

Wil je nog veel meer leren over Python en Data Science? Schrijf je dan in voor onze Python cursus voor data science, onze machine learning training, of voor onze data science opleiding en leer met vertrouwen te programmeren en analyseren in Python. Nadat je een van onze trainingen hebt gevolgd kun je zelfstandig verder aan de slag. Je kunt ook altijd even contact opnemen als je een vraag hebt.

Download één van onze opleidingsbrochures voor meer informatie

by: