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
- Pandas importeren
- Pandas Series en DataFrames
- Selecteren van data uit een DataFrame op diverse manieren
- (standaard) berekeningen uitvoeren
- Omgaan met missende waarden in Pandas
- Tekst manipuleren in Pandas
- Data samenvoegen
- Draaitabellen in Pandas
- Pandas data visualisatie mogelijkheden
- Data in verschillende bestandstypes openen en opslaan
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.
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.
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.
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'.
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.
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.
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.
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.
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.
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.
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.
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.
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:
Functie | Beschrijving |
---|---|
count | Telt het aantal niet-missende waarden |
sum | Som van de waarden |
mean | Gemiddelde |
median | Mediaan van de waarden |
min | Minimum |
max | Maximum |
mode | Modus |
abs | Geeft de absolute waarde |
std | Standaardafwijking |
var | Variantie |
Omgaan met missende waarden in Pandas
We voegen eerst twee missende waarden toe met Pandas voordat we dit gedeelte toelichten.
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.
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.
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
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 | 169.507401 |
4 | 1929-01-05 | vrouw | 174.348120 |
5 | 1995-12-06 | vrouw | 172.129023 |
6 | 1975-03-02 | vrouw | 163.659517 |
7 | 1975-03-02 | man | 173.502233 |
8 | 1939-11-04 | vrouw | 176.749675 |
9 | 2000-04-01 | vrouw | 168.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'.
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:
Methode | Omschrijving |
---|---|
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.
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.).
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.
print(df.plot.scatter(x='lengte', y='gewicht'))
AxesSubplot(0.125,0.125;0.775x0.755)
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
Rik is data scientist en marketeer bij Data Science Partners. Vanuit zijn achtergrond op de Technische Universiteit Eindhoven heeft hij veel affiniteit met data. Na zijn studie heeft hij als consultant altijd met data gewerkt en tevens ervaring opgedaan in het geven van trainingen.