2.2. Rijen filteren#

Een DataFrame biedt een aantal voordelen die numpy arrays (of lists/dicts) niet hebben. Eén daarvan is dat we eenvoudig rijen kunnen wegfilteren uit een dataset. Laten we eerst een DataFrame aanmaken.

import pandas as pd
import numpy as np

# Maak een vector aan met waarden van 0 tot 5 
# in stapjes van 0.05 (lijkt op np.linspace)
t = np.arange(0, 5, 0.05)

# y is een functie van t
y = np.sin(2 * np.pi * t)

# Verwerk de data in een DataFrame
data = pd.DataFrame({'Tijd': t, 'Meting': y})

# Met .head(X) vragen we we de eerste X regels van een DataFrame op.
print(data.head(25))
    Tijd        Meting
0   0.00  0.000000e+00
1   0.05  3.090170e-01
2   0.10  5.877853e-01
3   0.15  8.090170e-01
4   0.20  9.510565e-01
5   0.25  1.000000e+00
6   0.30  9.510565e-01
7   0.35  8.090170e-01
8   0.40  5.877853e-01
9   0.45  3.090170e-01
10  0.50  1.224647e-16
11  0.55 -3.090170e-01
12  0.60 -5.877853e-01
13  0.65 -8.090170e-01
14  0.70 -9.510565e-01
15  0.75 -1.000000e+00
16  0.80 -9.510565e-01
17  0.85 -8.090170e-01
18  0.90 -5.877853e-01
19  0.95 -3.090170e-01
20  1.00 -2.449294e-16
21  1.05  3.090170e-01
22  1.10  5.877853e-01
23  1.15  8.090170e-01
24  1.20  9.510565e-01

Je kunt eenvoudig rijen uit je dataset wegfilteren door een lijst aan te maken, die True (of 1), en False (of 0) bevatten als bepaalde rijen wel of niet geselecteerd moeten worden. Vaak zul je in plaats van een lijst handmatig in te voeren, een conditie op het huidge DataFrame laten bepalen of rijen data wel of niet weggefilterd moeten worden. Bijvoorbeeld als we uit de eerder gebruikte dataset alleen de rijen willen hebben voor halve seconden:

# Maak een variabele aan, die True bevat waar data['Tijd'] deelbaar door 0.5 is
# (geheugensteun: met % krijgen we een 'rest na deling' terug)
halve_seconden = ( data['Tijd'] % 0.5 ) == 0

print('Variabele met True als de tijd deelbaar is door 0.5:')
print(halve_seconden.head(25))
print('\n\n')

# Filter nu deze rijen uit de originele dataset
data_halve_seconden = data[halve_seconden]
print('Gefilterde dataset:\n')
print(data_halve_seconden)
Variabele met True als de tijd deelbaar is door 0.5:
0      True
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10     True
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    False
20     True
21    False
22    False
23    False
24    False
Name: Tijd, dtype: bool



Gefilterde dataset:

    Tijd        Meting
0    0.0  0.000000e+00
10   0.5  1.224647e-16
20   1.0 -2.449294e-16
30   1.5  3.673940e-16
40   2.0 -4.898587e-16
50   2.5  6.123234e-16
60   3.0 -7.347881e-16
70   3.5  8.572528e-16
80   4.0 -9.797174e-16
90   4.5  1.102182e-15

2.2.1. Filteren in één regel#

Dit kan nog iets compacter en eleganter, door de hulpvariabele weg te laten en juist een variabele met een instelling (deelbaar_door, om eenvoudig ons filter aan te kunnen passen en de code beter leesbaar te maken) toe te voegen:

deelbaar_door = 0.5
data_gefilterd = data[ (data['Tijd'] % deelbaar_door) == 0 ]

print(data_gefilterd)
    Tijd        Meting
0    0.0  0.000000e+00
10   0.5  1.224647e-16
20   1.0 -2.449294e-16
30   1.5  3.673940e-16
40   2.0 -4.898587e-16
50   2.5  6.123234e-16
60   3.0 -7.347881e-16
70   3.5  8.572528e-16
80   4.0 -9.797174e-16
90   4.5  1.102182e-15

2.2.2. Resultaat#

Je kunt het resultaat weer plotten, bijvoorbeeld met behulp van matplotlib.

import matplotlib.pyplot as plt


# Plot de originele data.

plt.plot(data['Tijd'], 
         data['Meting'],
         label='Data')


# Plot ook de gefilterde data.
#
# Als we het extra argument ‘ko’ toevoegen, tekenen we bolletjes 
# op de beoogde datapunten

plt.plot(data_gefilterd['Tijd'],
         data_gefilterd['Meting'], 
         'ko', 
         label='Gefilterde Data')

# Voorzie de plot van aslabels, een legenda en een grid.

plt.xlabel('Tijd')
plt.ylabel('Meting')
plt.legend(loc=1)
plt.grid()

plt.show()
_images/05_a_data_filteren_7_0.png