Exemplo: manipulação de NaNs e limpeza de dados

Neste exemplo, usaremos um arquivo com muitos dados ausentes (representados por NaNs) para explorar o conceito de filtros. Além disso, vamos fazer um gráfico simples para representar os dados. Para isso, vamos usar duas bibliotecas importantes: Pandas (que já mencionamos) e matplotlib.


In [1]:
import pandas as pd

Primeiramente, vamos ler o arquivo usando tabs como separadores.


In [2]:
dados = pd.read_csv('data_from_odv_data_carbon-sse_after_correction_spikes_v3_O2_corr.txt', sep = '\t', lineterminator='\n')


/usr/lib/python3.5/site-packages/IPython/core/interactiveshell.py:2717: DtypeWarning: Columns (1) have mixed types. Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)

In [3]:
dados


Out[3]:
Cruise Station Type mon/day/yr hh:mm Longitude [degrees_east] Latitude [degrees_north] Bot. Depth [m] Cast QF ... QF.19 Oxygen [ml l] QF.20 Num Scan per bin QF.21 flag QF.22 Section Longitude:DOUBLE QF.23 QV:ODV:SAMPLE
0 NHoCruzeiro 5 C 12/6/2010 23:22 308.4600 -34.384 1052.0 1 1 ... 1 5.07 1 33 1 NaN 1 NaN 1 1
1 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 42 1 NaN 1 NaN 1 1
2 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.18 1 46 1 NaN 1 NaN 1 1
3 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.23 1 36 1 NaN 1 NaN 1 1
4 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.18 1 26 1 NaN 1 NaN 1 1
5 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.27 1 28 1 NaN 1 NaN 1 1
6 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.23 1 55 1 NaN 1 NaN 1 1
7 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.18 1 27 1 NaN 1 NaN 1 1
8 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.14 1 53 1 NaN 1 NaN 1 1
9 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 44 1 NaN 1 NaN 1 1
10 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.17 1 48 1 NaN 1 NaN 1 1
11 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.20 1 53 1 NaN 1 NaN 1 1
12 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.15 1 47 1 NaN 1 NaN 1 1
13 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.16 1 43 1 NaN 1 NaN 1 1
14 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.14 1 53 1 NaN 1 NaN 1 1
15 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.10 1 59 1 NaN 1 NaN 1 1
16 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.08 1 59 1 NaN 1 NaN 1 1
17 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.02 1 42 1 NaN 1 NaN 1 1
18 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 60 1 NaN 1 NaN 1 1
19 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.12 1 41 1 NaN 1 NaN 1 1
20 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.07 1 34 1 NaN 1 NaN 1 1
21 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.03 1 49 1 NaN 1 NaN 1 1
22 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 44 1 NaN 1 NaN 1 1
23 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.04 1 22 1 NaN 1 NaN 1 1
24 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.04 1 21 1 NaN 1 NaN 1 1
25 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.06 1 24 1 NaN 1 NaN 1 1
26 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.08 1 24 1 NaN 1 NaN 1 1
27 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.02 1 33 1 NaN 1 NaN 1 1
28 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.02 1 46 1 NaN 1 NaN 1 1
29 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.89 1 22 1 NaN 1 NaN 1 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
57652 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.53 1 46 1 NaN 1 NaN 1 1
57653 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.53 1 45 1 NaN 1 NaN 1 1
57654 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.51 1 28 1 NaN 1 NaN 1 1
57655 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.50 1 28 1 NaN 1 NaN 1 1
57656 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.50 1 57 1 NaN 1 NaN 1 1
57657 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.47 1 33 1 NaN 1 NaN 1 1
57658 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.38 1 31 1 NaN 1 NaN 1 1
57659 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.53 1 29 1 NaN 1 NaN 1 1
57660 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.60 1 60 1 NaN 1 NaN 1 1
57661 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.69 1 40 1 NaN 1 NaN 1 1
57662 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.72 1 35 1 NaN 1 NaN 1 1
57663 NHoCruzeiro 080e B 1/7/2011 0:06 319.0342 -22.119 24.0 1 1 ... 1 4.70 1 35 1 NaN 1 NaN 1 1
57664 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.63 1 24 1 NaN 1 NaN 1 1
57665 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.53 1 18 1 NaN 1 NaN 1 1
57666 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.26 1 19 1 NaN 1 NaN 1 1
57667 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.19 1 26 1 NaN 1 NaN 1 1
57668 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.37 1 34 1 NaN 1 NaN 1 1
57669 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.48 1 28 1 NaN 1 NaN 1 1
57670 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.56 1 51 1 NaN 1 NaN 1 1
57671 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.52 1 74 1 NaN 1 NaN 1 1
57672 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.41 1 54 1 NaN 1 NaN 1 1
57673 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.42 1 38 1 NaN 1 NaN 1 1
57674 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.41 1 46 1 NaN 1 NaN 1 1
57675 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.40 1 38 1 NaN 1 NaN 1 1
57676 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.41 1 81 1 NaN 1 NaN 1 1
57677 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.42 1 16 1 NaN 1 NaN 1 1
57678 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.48 1 22 1 NaN 1 NaN 1 1
57679 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.52 1 21 1 NaN 1 NaN 1 1
57680 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.55 1 25 1 NaN 1 NaN 1 1
57681 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.58 1 40 1 NaN 1 NaN 1 1

57682 rows × 57 columns

Agora, vamos tentar identificar de quantas estações temos dados disponíveis.


In [4]:
dados.Station


Out[4]:
0           5
1         NaN
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8         NaN
9         NaN
10        NaN
11        NaN
12        NaN
13        NaN
14        NaN
15        NaN
16        NaN
17        NaN
18        NaN
19        NaN
20        NaN
21        NaN
22        NaN
23        NaN
24        NaN
25        NaN
26        NaN
27        NaN
28        NaN
29        NaN
         ... 
57652     NaN
57653     NaN
57654     NaN
57655     NaN
57656     NaN
57657     NaN
57658     NaN
57659     NaN
57660     NaN
57661     NaN
57662     NaN
57663    080e
57664     NaN
57665     NaN
57666     NaN
57667     NaN
57668     NaN
57669     NaN
57670     NaN
57671     NaN
57672     NaN
57673     NaN
57674     NaN
57675     NaN
57676     NaN
57677     NaN
57678     NaN
57679     NaN
57680     NaN
57681     NaN
Name: Station, dtype: object

Agora, queremos identificar quantas estações temos; para isso, vamos identificar todas as linhas em que a coluna Station tem valores válidos. Podemos fazer isso de duas maneiras: primeiro, vamos identificar todas as linhas em que a coluna Station contém NaNs:


In [5]:
dados.Station.isnull()


Out[5]:
0        False
1         True
2         True
3         True
4         True
5         True
6         True
7         True
8         True
9         True
10        True
11        True
12        True
13        True
14        True
15        True
16        True
17        True
18        True
19        True
20        True
21        True
22        True
23        True
24        True
25        True
26        True
27        True
28        True
29        True
         ...  
57652     True
57653     True
57654     True
57655     True
57656     True
57657     True
57658     True
57659     True
57660     True
57661     True
57662     True
57663    False
57664     True
57665     True
57666     True
57667     True
57668     True
57669     True
57670     True
57671     True
57672     True
57673     True
57674     True
57675     True
57676     True
57677     True
57678     True
57679     True
57680     True
57681     True
Name: Station, dtype: bool

Agora, vamos fazer o oposto: verificar quais linhas da coluna Station não tem NaNs:


In [6]:
dados.Station.notnull()


Out[6]:
0         True
1        False
2        False
3        False
4        False
5        False
6        False
7        False
8        False
9        False
10       False
11       False
12       False
13       False
14       False
15       False
16       False
17       False
18       False
19       False
20       False
21       False
22       False
23       False
24       False
25       False
26       False
27       False
28       False
29       False
         ...  
57652    False
57653    False
57654    False
57655    False
57656    False
57657    False
57658    False
57659    False
57660    False
57661    False
57662    False
57663     True
57664    False
57665    False
57666    False
57667    False
57668    False
57669    False
57670    False
57671    False
57672    False
57673    False
57674    False
57675    False
57676    False
57677    False
57678    False
57679    False
57680    False
57681    False
Name: Station, dtype: bool

Agora, podemos fazer um filtro: como o resultado da operação acima é uma coluna com valores Verdadeiro (True) ou Falso (False), podemos selecionar entre os dados apenas aquelas linhas para as quais a operação acima resultou em True. Isso é uma forma de slicing, mas como envolve uma operação lógica (algo que retorna verdadeiro ou falso) chamamos isso de filtro:


In [7]:
dados[dados.Station.notnull()]


Out[7]:
Cruise Station Type mon/day/yr hh:mm Longitude [degrees_east] Latitude [degrees_north] Bot. Depth [m] Cast QF ... QF.19 Oxygen [ml l] QF.20 Num Scan per bin QF.21 flag QF.22 Section Longitude:DOUBLE QF.23 QV:ODV:SAMPLE
0 NHoCruzeiro 5 C 12/6/2010 23:22 308.4600 -34.384 1052.0 1 1 ... 1 5.07 1 33 1 NaN 1 NaN 1 1
1043 NHoCruzeiro 6 C 12/7/2010 2:16 308.6418 -34.521 1780.0 1 1 ... 1 5.07 1 33 1 NaN 1 NaN 1 1
2770 NHoCruzeiro 7 C 12/7/2010 7:31 308.9007 -34.708 2252.0 1 1 ... 1 4.97 1 21 1 NaN 1 NaN 1 1
4935 NHoCruzeiro 8 C 12/7/2010 10:49 309.1553 -34.862 2747.0 1 1 ... 1 5.04 1 28 1 NaN 1 NaN 1 1
7634 NHoCruzeiro 9 C 12/7/2010 23:04 310.1878 -33.660 2404.0 1 1 ... 1 3.97 1 34 1 NaN 1 NaN 1 1
9902 NHoCruzeiro 10 C 12/8/2010 4:35 309.7402 -33.352 820.0 1 1 ... 1 4.77 1 33 1 NaN 1 NaN 1 1
10644 NHoCruzeiro 11 C 12/8/2010 7:57 309.5482 -33.225 434.0 1 1 ... 1 4.63 1 36 1 NaN 1 NaN 1 1
11061 NHoCruzeiro 24 C 12/9/2010 23:28 310.2707 -31.837 1526.0 1 1 ... 1 4.97 1 35 1 NaN 1 NaN 1 1
12560 NHoCruzeiro 25 C 12/10/2010 2:52 310.4820 -31.934 2038.0 1 1 ... 1 4.75 1 31 1 NaN 1 NaN 1 1
14493 NHoCruzeiro 26 C 12/10/2010 5:58 310.7192 -32.075 2336.0 1 1 ... 1 4.88 1 20 1 NaN 1 NaN 1 1
16768 NHoCruzeiro 27 C 12/10/2010 20:02 311.9665 -30.861 2574.0 1 1 ... 1 4.77 1 37 1 NaN 1 NaN 1 1
19266 NHoCruzeiro 28 C 12/11/2010 0:16 311.7163 -30.714 1452.0 1 1 ... 1 4.79 1 26 1 NaN 1 NaN 1 1
20703 NHoCruzeiro 29 C 12/11/2010 4:16 311.4837 -30.592 721.0 1 1 ... 1 4.60 1 27 1 NaN 1 NaN 1 1
21344 NHoCruzeiro 38 C 12/12/2010 15:21 312.2043 -29.252 590.0 1 1 ... 1 4.77 1 32 1 NaN 1 NaN 1 1
21910 NHoCruzeiro 39 C 12/12/2010 18:26 312.5760 -29.414 1375.0 1 1 ... 1 4.55 1 24 1 NaN 1 NaN 1 1
23224 NHoCruzeiro 40 C 12/12/2010 21:52 312.8970 -29.549 1999.0 1 1 ... 1 4.81 1 36 1 NaN 1 NaN 1 1
25121 NHoCruzeiro 41 C 12/13/2010 12:27 313.4408 -28.234 1703.0 1 1 ... 1 4.63 1 26 1 NaN 1 NaN 1 1
26748 NHoCruzeiro 49 C 12/18/2010 8:06 313.0522 -28.131 491.0 1 1 ... 1 3.44 1 18 1 NaN 1 NaN 1 1
27211 NHoCruzeiro 50 C 12/18/2010 12:01 313.4473 -28.246 1734.0 1 1 ... 1 4.56 1 37 1 NaN 1 NaN 1 1
28907 NHoCruzeiro 51 C 12/18/2010 19:51 313.7685 -27.347 1800.0 1 1 ... 1 4.55 1 27 1 NaN 1 NaN 1 1
30617 NHoCruzeiro 52 C 12/18/2010 22:59 313.4742 -27.268 1188.0 1 1 ... 1 4.68 1 17 1 NaN 1 NaN 1 1
31782 NHoCruzeiro 53 C 12/19/2010 0:59 313.3147 -27.214 743.0 1 1 ... 1 4.76 1 27 1 NaN 1 NaN 1 1
32489 NHoCruzeiro 62 C 12/20/2010 10:57 313.8275 -26.553 525.0 1 1 ... 1 4.75 1 28 1 NaN 1 NaN 1 1
32996 NHoCruzeiro 63 C 12/20/2010 14:55 314.1617 -26.585 975.0 1 1 ... 1 4.66 1 45 1 NaN 1 NaN 1 1
33922 NHoCruzeiro 73 C 1/5/2011 20:01 319.8377 -21.477 685.0 1 1 ... 1 4.65 1 14 1 NaN 1 NaN 1 1
34435 NHoCruzeiro 74 C 1/5/2011 23:35 319.9645 -21.453 1230.0 1 1 ... 1 4.49 1 16 1 NaN 1 NaN 1 1
35616 NHoCruzeiro 75 C 1/6/2011 3:09 320.1532 -21.832 1196.0 1 1 ... 1 4.38 1 57 1 NaN 1 NaN 1 1
36772 NHoCruzeiro 76 C 1/6/2011 5:16 320.0130 -21.889 518.0 1 1 ... 1 4.36 1 41 1 NaN 1 NaN 1 1
37229 NHoCruzeiro 83 C 1/7/2011 9:21 319.6620 -22.518 552.0 1 1 ... 1 4.39 1 24 1 NaN 1 NaN 1 1
37766 NHoCruzeiro 84 C 1/7/2011 13:53 320.0577 -22.304 1055.0 1 1 ... 1 4.73 1 33 1 NaN 1 NaN 1 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
55788 NHoCruzeiro 72 B 1/5/2011 17:41 319.6820 -21.517 52.0 1 1 ... 1 4.64 1 21 1 NaN 1 NaN 1 1
55828 NHoCruzeiro 77 B 1/6/2011 7:58 319.7958 -21.917 66.0 1 1 ... 1 4.56 1 26 1 NaN 1 NaN 1 1
55886 NHoCruzeiro 78 B 1/6/2011 10:53 319.4352 -21.965 29.0 1 1 ... 1 3.18 1 41 1 NaN 1 NaN 1 1
55909 NHoCruzeiro 81 B 1/7/2011 2:35 319.2327 -22.211 57.0 1 1 ... 1 4.72 1 25 1 NaN 1 NaN 1 1
55959 NHoCruzeiro 82 B 1/7/2011 6:13 319.4162 -22.305 81.0 1 1 ... 1 4.58 1 51 1 NaN 1 NaN 1 1
56035 NHoCruzeiro 90 B 1/8/2011 8:20 319.1933 -22.704 100.0 1 1 ... 1 4.60 1 22 1 NaN 1 NaN 1 1
56127 NHoCruzeiro 91 B 1/8/2011 10:31 319.0527 -22.575 65.0 1 1 ... 1 4.66 1 28 1 NaN 1 NaN 1 1
56186 NHoCruzeiro 92 B 1/8/2011 13:33 318.8382 -22.442 51.0 1 1 ... 1 4.69 1 29 1 NaN 1 NaN 1 1
56232 NHoCruzeiro 93 B 1/8/2011 15:35 318.6787 -22.322 31.0 1 1 ... 1 4.81 1 39 1 NaN 1 NaN 1 1
56258 NHoCruzeiro 94 B 1/8/2011 19:10 318.2633 -22.597 44.0 1 1 ... 1 5.29 1 30 1 NaN 1 NaN 1 1
56296 NHoCruzeiro 95 B 1/8/2011 22:40 318.5617 -22.807 62.0 1 1 ... 1 5.30 1 20 1 NaN 1 NaN 1 1
56348 NHoCruzeiro 96 B 1/9/2011 1:50 318.8605 -23.036 95.0 1 1 ... 1 4.56 1 34 1 NaN 1 NaN 1 1
56438 NHoCruzeiro 97 B 1/9/2011 3:41 318.9782 -23.132 98.0 1 1 ... 1 4.57 1 42 1 NaN 1 NaN 1 1
56523 NHoCruzeiro 100 B 1/9/2011 14:36 318.6798 -23.556 146.0 1 1 ... 1 4.54 1 21 1 NaN 1 NaN 1 1
56663 NHoCruzeiro 101 B 1/9/2011 17:49 318.4612 -23.386 120.0 1 1 ... 1 4.63 1 24 1 NaN 1 NaN 1 1
56774 NHoCruzeiro 102 B 1/9/2011 20:46 318.2067 -23.250 124.0 1 1 ... 1 4.61 1 19 1 NaN 1 NaN 1 1
56893 NHoCruzeiro 103 B 1/10/2011 0:10 317.9988 -23.105 111.0 1 1 ... 1 4.56 1 29 1 NaN 1 NaN 1 1
56994 NHoCruzeiro 104 B 1/10/2011 2:21 317.9935 -23.309 128.0 1 1 ... 1 4.62 1 21 1 NaN 1 NaN 1 1
57116 NHoCruzeiro 105 B 1/10/2011 4:29 317.9985 -23.526 156.0 1 1 ... 1 4.51 1 31 1 NaN 1 NaN 1 1
57265 NHoCruzeiro 110 B 1/10/2011 22:37 317.4990 -23.544 138.0 1 1 ... 1 3.61 1 37 1 NaN 1 NaN 1 1
57393 NHoCruzeiro 111 B 1/11/2011 2:23 317.4960 -23.274 110.0 1 1 ... 1 4.51 1 23 1 NaN 1 NaN 1 1
57496 NHoCruzeiro 112 B 1/11/2011 5:00 317.5155 -22.996 52.0 1 1 ... 1 4.65 1 42 1 NaN 1 NaN 1 1
57544 NHoCruzeiro 70 B 1/5/2011 11:48 319.0652 -21.617 15.0 1 1 ... 1 4.62 1 37 1 NaN 1 NaN 1 1
57556 NHoCruzeiro 71 B 1/5/2011 14:43 319.3987 -21.568 24.0 1 1 ... 1 4.52 1 90 1 NaN 1 NaN 1 1
57575 NHoCruzeiro 79 B 1/6/2011 13:08 319.2237 -21.983 14.0 1 1 ... 1 4.62 1 47 1 NaN 1 NaN 1 1
57587 NHoCruzeiro 080a B 1/6/2011 15:58 319.0268 -22.124 25.0 1 1 ... 1 4.53 1 29 1 NaN 1 NaN 1 1
57606 NHoCruzeiro 080b B 1/6/2011 18:19 319.0337 -22.118 25.0 1 1 ... 1 4.35 1 49 1 NaN 1 NaN 1 1
57625 NHoCruzeiro 080c B 1/6/2011 20:13 319.0358 -22.120 25.0 1 1 ... 1 4.57 1 50 1 NaN 1 NaN 1 1
57644 NHoCruzeiro 080d B 1/6/2011 22:13 319.0380 -22.117 24.0 1 1 ... 1 4.67 1 22 1 NaN 1 NaN 1 1
57663 NHoCruzeiro 080e B 1/7/2011 0:06 319.0342 -22.119 24.0 1 1 ... 1 4.70 1 35 1 NaN 1 NaN 1 1

119 rows × 57 columns

Desta forma, o resultado acima nos retorna todas as linhas da planilha dados que contém informações sobre estações; de fato, cada linha acima corresponde a uma estação.


In [8]:
estacoes = dados[dados.Station.notnull()]

Podemos investigar os índices desta nova tabela estacoes (a coluna mais à esquerda mostrada acima, que não faz parte da tabela, mas é um índice criado pelo Pandas para acessar os elementos da tabela)


In [9]:
estacoes.index


Out[9]:
Int64Index([    0,  1043,  2770,  4935,  7634,  9902, 10644, 11061, 12560,
            14493,
            ...
            57393, 57496, 57544, 57556, 57575, 57587, 57606, 57625, 57644,
            57663],
           dtype='int64', length=119)

Observe que os índices da tabela estacoes ainda se referem aos índices das linhas correspondentes na tabela original! Isso ocorre pois extraímos a tabela estacoes da tabela dados.


In [10]:
estacoes.index[4]


Out[10]:
7634

In [11]:
estacoes.index[1]


Out[11]:
1043

Agora, vamos analisar o que acontece apenas na primeira estação; para isso, vamos selecionar da tabela original apenas as linhas que estão entre as informações da estação 1 e as informações da estação 2 (lembrando que os índices do Python iniciam-se no zero). Usando o método loc:


In [12]:
dados.loc[estacoes.index[0]+1:estacoes.index[1]-1,:]


Out[12]:
Cruise Station Type mon/day/yr hh:mm Longitude [degrees_east] Latitude [degrees_north] Bot. Depth [m] Cast QF ... QF.19 Oxygen [ml l] QF.20 Num Scan per bin QF.21 flag QF.22 Section Longitude:DOUBLE QF.23 QV:ODV:SAMPLE
1 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 42 1 NaN 1 NaN 1 1
2 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.18 1 46 1 NaN 1 NaN 1 1
3 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.23 1 36 1 NaN 1 NaN 1 1
4 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.18 1 26 1 NaN 1 NaN 1 1
5 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.27 1 28 1 NaN 1 NaN 1 1
6 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.23 1 55 1 NaN 1 NaN 1 1
7 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.18 1 27 1 NaN 1 NaN 1 1
8 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.14 1 53 1 NaN 1 NaN 1 1
9 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 44 1 NaN 1 NaN 1 1
10 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.17 1 48 1 NaN 1 NaN 1 1
11 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.20 1 53 1 NaN 1 NaN 1 1
12 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.15 1 47 1 NaN 1 NaN 1 1
13 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.16 1 43 1 NaN 1 NaN 1 1
14 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.14 1 53 1 NaN 1 NaN 1 1
15 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.10 1 59 1 NaN 1 NaN 1 1
16 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.08 1 59 1 NaN 1 NaN 1 1
17 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.02 1 42 1 NaN 1 NaN 1 1
18 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 60 1 NaN 1 NaN 1 1
19 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.12 1 41 1 NaN 1 NaN 1 1
20 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.07 1 34 1 NaN 1 NaN 1 1
21 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.03 1 49 1 NaN 1 NaN 1 1
22 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.09 1 44 1 NaN 1 NaN 1 1
23 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.04 1 22 1 NaN 1 NaN 1 1
24 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.04 1 21 1 NaN 1 NaN 1 1
25 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.06 1 24 1 NaN 1 NaN 1 1
26 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.08 1 24 1 NaN 1 NaN 1 1
27 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.02 1 33 1 NaN 1 NaN 1 1
28 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.02 1 46 1 NaN 1 NaN 1 1
29 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.89 1 22 1 NaN 1 NaN 1 1
30 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.89 1 17 1 NaN 1 NaN 1 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1013 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.48 1 37 1 NaN 1 NaN 1 1
1014 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.48 1 27 1 NaN 1 NaN 1 1
1015 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.49 1 38 1 NaN 1 NaN 1 1
1016 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.48 1 33 1 NaN 1 NaN 1 1
1017 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.48 1 24 1 NaN 1 NaN 1 1
1018 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.47 1 21 1 NaN 1 NaN 1 1
1019 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.47 1 22 1 NaN 1 NaN 1 1
1020 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.47 1 21 1 NaN 1 NaN 1 1
1021 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.47 1 26 1 NaN 1 NaN 1 1
1022 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.46 1 43 1 NaN 1 NaN 1 1
1023 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.47 1 62 1 NaN 1 NaN 1 1
1024 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.46 1 46 1 NaN 1 NaN 1 1
1025 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.46 1 33 1 NaN 1 NaN 1 1
1026 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.45 1 28 1 NaN 1 NaN 1 1
1027 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.45 1 32 1 NaN 1 NaN 1 1
1028 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.45 1 29 1 NaN 1 NaN 1 1
1029 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.43 1 28 1 NaN 1 NaN 1 1
1030 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.44 1 34 1 NaN 1 NaN 1 1
1031 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.44 1 33 1 NaN 1 NaN 1 1
1032 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.44 1 43 1 NaN 1 NaN 1 1
1033 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.44 1 42 1 NaN 1 NaN 1 1
1034 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.43 1 22 1 NaN 1 NaN 1 1
1035 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.43 1 20 1 NaN 1 NaN 1 1
1036 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.43 1 31 1 NaN 1 NaN 1 1
1037 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.42 1 1 1 NaN 1 NaN 1 1
1038 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.62 1 26 1 NaN 1 NaN 1 1
1039 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.81 1 33 1 NaN 1 NaN 1 1
1040 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 4.89 1 30 1 NaN 1 NaN 1 1
1041 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.00 1 27 1 NaN 1 NaN 1 1
1042 NaN NaN NaN NaN NaN NaN NaN NaN 1 1 ... 1 5.04 1 25 1 NaN 1 NaN 1 1

1042 rows × 57 columns

Salvamos estes dados na nova tabela estacao1:


In [13]:
estacao1 = dados.loc[estacoes.index[0]+1:estacoes.index[1]-1,:]

Agora, queremos extrair dos dados desta estação a média das medições de oxigênio na água.


In [14]:
estacao1.columns


Out[14]:
Index(['Cruise', 'Station', 'Type', 'mon/day/yr', 'hh:mm',
       'Longitude [degrees_east]', 'Latitude [degrees_north]',
       'Bot. Depth [m]', 'Cast', 'QF', 'Scan', 'QF.1', 'Time', 'QF.2', 'DR',
       'QF.3', 'Pressure [db]', 'QF.4', 'Temperature_1 [C]', 'QF.5',
       'Temperature_2 [C]', 'QF.6', 'Conductivity_1 [mS cm]', 'QF.7',
       'Conductivity_2 [mS cm]', 'QF.8', 'OV', 'QF.9', 'Fluorescence [mg/m^3]',
       'QF.10', 'Prof [m]', 'QF.11', 'PTEMP_1', 'QF.12', 'PTEMP_2', 'QF.13',
       'Salinity_1', 'QF.14', 'Salinity_2', 'QF.15', 'DENS_1 [mS cm]', 'QF.16',
       'DENS_2', 'QF.17', 'PDENS_1 [mS cm]', 'QF.18', 'PDENS_2', 'QF.19',
       'Oxygen [ml l]', 'QF.20', 'Num Scan per bin', 'QF.21', 'flag', 'QF.22',
       'Section Longitude:DOUBLE', 'QF.23', 'QV:ODV:SAMPLE\r'],
      dtype='object')

In [15]:
estacao1['Oxygen [ml l]']


Out[15]:
1       5.09
2       5.18
3       5.23
4       5.18
5       5.27
6       5.23
7       5.18
8       5.14
9       5.09
10      5.17
11      5.20
12      5.15
13      5.16
14      5.14
15      5.10
16      5.08
17      5.02
18      5.09
19      5.12
20      5.07
21      5.03
22      5.09
23      5.04
24      5.04
25      5.06
26      5.08
27      5.02
28      5.02
29      4.89
30      4.89
        ... 
1013    4.48
1014    4.48
1015    4.49
1016    4.48
1017    4.48
1018    4.47
1019    4.47
1020    4.47
1021    4.47
1022    4.46
1023    4.47
1024    4.46
1025    4.46
1026    4.45
1027    4.45
1028    4.45
1029    4.43
1030    4.44
1031    4.44
1032    4.44
1033    4.44
1034    4.43
1035    4.43
1036    4.43
1037    4.42
1038    4.62
1039    4.81
1040    4.89
1041    5.00
1042    5.04
Name: Oxygen [ml l], dtype: float64

In [16]:
estacao1['Oxygen [ml l]'].mean()


Out[16]:
4.8428023032629568

Agora, vamos fazer um gráfico das medições, marcando a média calculada acima no gráfico.


In [19]:
import matplotlib.pyplot as plt
%matplotlib inline

In [20]:
plt.plot(estacao1['Oxygen [ml l]'])


Out[20]:
[<matplotlib.lines.Line2D at 0x7fc71acd3ba8>]

Observe que é possível obtermos uma lista dos índices de uma tabela do Pandas usando o método tabela.index.values. No nosso caso, para nossa tabela estacao1, temos:


In [21]:
list(estacao1.index.values)


Out[21]:
[1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 13,
 14,
 15,
 16,
 17,
 18,
 19,
 20,
 21,
 22,
 23,
 24,
 25,
 26,
 27,
 28,
 29,
 30,
 31,
 32,
 33,
 34,
 35,
 36,
 37,
 38,
 39,
 40,
 41,
 42,
 43,
 44,
 45,
 46,
 47,
 48,
 49,
 50,
 51,
 52,
 53,
 54,
 55,
 56,
 57,
 58,
 59,
 60,
 61,
 62,
 63,
 64,
 65,
 66,
 67,
 68,
 69,
 70,
 71,
 72,
 73,
 74,
 75,
 76,
 77,
 78,
 79,
 80,
 81,
 82,
 83,
 84,
 85,
 86,
 87,
 88,
 89,
 90,
 91,
 92,
 93,
 94,
 95,
 96,
 97,
 98,
 99,
 100,
 101,
 102,
 103,
 104,
 105,
 106,
 107,
 108,
 109,
 110,
 111,
 112,
 113,
 114,
 115,
 116,
 117,
 118,
 119,
 120,
 121,
 122,
 123,
 124,
 125,
 126,
 127,
 128,
 129,
 130,
 131,
 132,
 133,
 134,
 135,
 136,
 137,
 138,
 139,
 140,
 141,
 142,
 143,
 144,
 145,
 146,
 147,
 148,
 149,
 150,
 151,
 152,
 153,
 154,
 155,
 156,
 157,
 158,
 159,
 160,
 161,
 162,
 163,
 164,
 165,
 166,
 167,
 168,
 169,
 170,
 171,
 172,
 173,
 174,
 175,
 176,
 177,
 178,
 179,
 180,
 181,
 182,
 183,
 184,
 185,
 186,
 187,
 188,
 189,
 190,
 191,
 192,
 193,
 194,
 195,
 196,
 197,
 198,
 199,
 200,
 201,
 202,
 203,
 204,
 205,
 206,
 207,
 208,
 209,
 210,
 211,
 212,
 213,
 214,
 215,
 216,
 217,
 218,
 219,
 220,
 221,
 222,
 223,
 224,
 225,
 226,
 227,
 228,
 229,
 230,
 231,
 232,
 233,
 234,
 235,
 236,
 237,
 238,
 239,
 240,
 241,
 242,
 243,
 244,
 245,
 246,
 247,
 248,
 249,
 250,
 251,
 252,
 253,
 254,
 255,
 256,
 257,
 258,
 259,
 260,
 261,
 262,
 263,
 264,
 265,
 266,
 267,
 268,
 269,
 270,
 271,
 272,
 273,
 274,
 275,
 276,
 277,
 278,
 279,
 280,
 281,
 282,
 283,
 284,
 285,
 286,
 287,
 288,
 289,
 290,
 291,
 292,
 293,
 294,
 295,
 296,
 297,
 298,
 299,
 300,
 301,
 302,
 303,
 304,
 305,
 306,
 307,
 308,
 309,
 310,
 311,
 312,
 313,
 314,
 315,
 316,
 317,
 318,
 319,
 320,
 321,
 322,
 323,
 324,
 325,
 326,
 327,
 328,
 329,
 330,
 331,
 332,
 333,
 334,
 335,
 336,
 337,
 338,
 339,
 340,
 341,
 342,
 343,
 344,
 345,
 346,
 347,
 348,
 349,
 350,
 351,
 352,
 353,
 354,
 355,
 356,
 357,
 358,
 359,
 360,
 361,
 362,
 363,
 364,
 365,
 366,
 367,
 368,
 369,
 370,
 371,
 372,
 373,
 374,
 375,
 376,
 377,
 378,
 379,
 380,
 381,
 382,
 383,
 384,
 385,
 386,
 387,
 388,
 389,
 390,
 391,
 392,
 393,
 394,
 395,
 396,
 397,
 398,
 399,
 400,
 401,
 402,
 403,
 404,
 405,
 406,
 407,
 408,
 409,
 410,
 411,
 412,
 413,
 414,
 415,
 416,
 417,
 418,
 419,
 420,
 421,
 422,
 423,
 424,
 425,
 426,
 427,
 428,
 429,
 430,
 431,
 432,
 433,
 434,
 435,
 436,
 437,
 438,
 439,
 440,
 441,
 442,
 443,
 444,
 445,
 446,
 447,
 448,
 449,
 450,
 451,
 452,
 453,
 454,
 455,
 456,
 457,
 458,
 459,
 460,
 461,
 462,
 463,
 464,
 465,
 466,
 467,
 468,
 469,
 470,
 471,
 472,
 473,
 474,
 475,
 476,
 477,
 478,
 479,
 480,
 481,
 482,
 483,
 484,
 485,
 486,
 487,
 488,
 489,
 490,
 491,
 492,
 493,
 494,
 495,
 496,
 497,
 498,
 499,
 500,
 501,
 502,
 503,
 504,
 505,
 506,
 507,
 508,
 509,
 510,
 511,
 512,
 513,
 514,
 515,
 516,
 517,
 518,
 519,
 520,
 521,
 522,
 523,
 524,
 525,
 526,
 527,
 528,
 529,
 530,
 531,
 532,
 533,
 534,
 535,
 536,
 537,
 538,
 539,
 540,
 541,
 542,
 543,
 544,
 545,
 546,
 547,
 548,
 549,
 550,
 551,
 552,
 553,
 554,
 555,
 556,
 557,
 558,
 559,
 560,
 561,
 562,
 563,
 564,
 565,
 566,
 567,
 568,
 569,
 570,
 571,
 572,
 573,
 574,
 575,
 576,
 577,
 578,
 579,
 580,
 581,
 582,
 583,
 584,
 585,
 586,
 587,
 588,
 589,
 590,
 591,
 592,
 593,
 594,
 595,
 596,
 597,
 598,
 599,
 600,
 601,
 602,
 603,
 604,
 605,
 606,
 607,
 608,
 609,
 610,
 611,
 612,
 613,
 614,
 615,
 616,
 617,
 618,
 619,
 620,
 621,
 622,
 623,
 624,
 625,
 626,
 627,
 628,
 629,
 630,
 631,
 632,
 633,
 634,
 635,
 636,
 637,
 638,
 639,
 640,
 641,
 642,
 643,
 644,
 645,
 646,
 647,
 648,
 649,
 650,
 651,
 652,
 653,
 654,
 655,
 656,
 657,
 658,
 659,
 660,
 661,
 662,
 663,
 664,
 665,
 666,
 667,
 668,
 669,
 670,
 671,
 672,
 673,
 674,
 675,
 676,
 677,
 678,
 679,
 680,
 681,
 682,
 683,
 684,
 685,
 686,
 687,
 688,
 689,
 690,
 691,
 692,
 693,
 694,
 695,
 696,
 697,
 698,
 699,
 700,
 701,
 702,
 703,
 704,
 705,
 706,
 707,
 708,
 709,
 710,
 711,
 712,
 713,
 714,
 715,
 716,
 717,
 718,
 719,
 720,
 721,
 722,
 723,
 724,
 725,
 726,
 727,
 728,
 729,
 730,
 731,
 732,
 733,
 734,
 735,
 736,
 737,
 738,
 739,
 740,
 741,
 742,
 743,
 744,
 745,
 746,
 747,
 748,
 749,
 750,
 751,
 752,
 753,
 754,
 755,
 756,
 757,
 758,
 759,
 760,
 761,
 762,
 763,
 764,
 765,
 766,
 767,
 768,
 769,
 770,
 771,
 772,
 773,
 774,
 775,
 776,
 777,
 778,
 779,
 780,
 781,
 782,
 783,
 784,
 785,
 786,
 787,
 788,
 789,
 790,
 791,
 792,
 793,
 794,
 795,
 796,
 797,
 798,
 799,
 800,
 801,
 802,
 803,
 804,
 805,
 806,
 807,
 808,
 809,
 810,
 811,
 812,
 813,
 814,
 815,
 816,
 817,
 818,
 819,
 820,
 821,
 822,
 823,
 824,
 825,
 826,
 827,
 828,
 829,
 830,
 831,
 832,
 833,
 834,
 835,
 836,
 837,
 838,
 839,
 840,
 841,
 842,
 843,
 844,
 845,
 846,
 847,
 848,
 849,
 850,
 851,
 852,
 853,
 854,
 855,
 856,
 857,
 858,
 859,
 860,
 861,
 862,
 863,
 864,
 865,
 866,
 867,
 868,
 869,
 870,
 871,
 872,
 873,
 874,
 875,
 876,
 877,
 878,
 879,
 880,
 881,
 882,
 883,
 884,
 885,
 886,
 887,
 888,
 889,
 890,
 891,
 892,
 893,
 894,
 895,
 896,
 897,
 898,
 899,
 900,
 901,
 902,
 903,
 904,
 905,
 906,
 907,
 908,
 909,
 910,
 911,
 912,
 913,
 914,
 915,
 916,
 917,
 918,
 919,
 920,
 921,
 922,
 923,
 924,
 925,
 926,
 927,
 928,
 929,
 930,
 931,
 932,
 933,
 934,
 935,
 936,
 937,
 938,
 939,
 940,
 941,
 942,
 943,
 944,
 945,
 946,
 947,
 948,
 949,
 950,
 951,
 952,
 953,
 954,
 955,
 956,
 957,
 958,
 959,
 960,
 961,
 962,
 963,
 964,
 965,
 966,
 967,
 968,
 969,
 970,
 971,
 972,
 973,
 974,
 975,
 976,
 977,
 978,
 979,
 980,
 981,
 982,
 983,
 984,
 985,
 986,
 987,
 988,
 989,
 990,
 991,
 992,
 993,
 994,
 995,
 996,
 997,
 998,
 999,
 1000,
 ...]

Assim, é possível obtermos o mesmo gráfico que o visto acima, com o seguinte comando:


In [22]:
plt.plot(list(estacao1.index.values),estacao1['Oxygen [ml l]'])


Out[22]:
[<matplotlib.lines.Line2D at 0x7fc71a1aee80>]

Finalmente, vamos plotar nosso gráfico incluindo uma linha horizontal denotando a média dos valores. Calculamos a média usando o método mean do Pandas.


In [24]:
plt.plot(estacao1['Oxygen [ml l]'])
plt.axhline(y=estacao1['Oxygen [ml l]'].mean(), linestyle = "dashed", color = "r")
plt.title("Oxygen [ml l] for Station 1")


Out[24]:
<matplotlib.text.Text at 0x7fc71a0e5080>

(Fim da Aula 4, ministrada em 22/09/2016)