Estrutura e Tipos de Dados em Python

Manipulação de DataFrames em Python usando Pandas, incluindo seleção de linhas e colunas, filtragem de dados e tratamento de valores ausentes.

Neste tutorial, vamos explorar como trabalhar com estruturas de dados tabulares em Python usando a biblioteca Pandas. Utilizaremos o dataset de [pinguins de Palmer](https://allisonhorst.github.io/palmerpenguins/index.html}{target=“_blank”} como exemplo prático.

DicaCódigo em Python

Acompanha este tutorial o Tipos de dados em Python

1 Pacotes necessários

import pandas as pd
# pip install palmerpenguins
from palmerpenguins import load_penguins
NotaInstalação de palmerpenguins

O dataset palmerpenguins pode ser instalado com: pip install palmerpenguins

2 Carregando os dados

penguins = load_penguins()

3 Explorando a estrutura dos dados

3.1 Dimensões do DataFrame

penguins.shape  # (número de linhas, número de colunas)
(344, 8)

3.2 Primeiras observações

penguins.head()  # Mostra as primeiras 5 linhas
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 male 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 female 2007
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 female 2007
3 Adelie Torgersen NaN NaN NaN NaN NaN 2007
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 female 2007

3.3 Tipos de dados

penguins.dtypes  # Mostra o tipo de cada coluna
species               object
island                object
bill_length_mm       float64
bill_depth_mm        float64
flipper_length_mm    float64
body_mass_g          float64
sex                   object
year                   int64
dtype: object

4 Selecionando colunas

4.1 Seleção de uma coluna

penguins['species']  # Retorna uma Series
0         Adelie
1         Adelie
2         Adelie
3         Adelie
4         Adelie
         ...    
339    Chinstrap
340    Chinstrap
341    Chinstrap
342    Chinstrap
343    Chinstrap
Name: species, Length: 344, dtype: object

4.2 Seleção de múltiplas colunas

penguins[['species', 'island', 'body_mass_g']]  # Retorna um DataFrame
species island body_mass_g
0 Adelie Torgersen 3750.0
1 Adelie Torgersen 3800.0
2 Adelie Torgersen 3250.0
3 Adelie Torgersen NaN
4 Adelie Torgersen 3450.0
... ... ... ...
339 Chinstrap Dream 4000.0
340 Chinstrap Dream 3400.0
341 Chinstrap Dream 3775.0
342 Chinstrap Dream 4100.0
343 Chinstrap Dream 3775.0

344 rows × 3 columns

Dica

Diferença importante:
- df['coluna'] retorna uma Series (uma dimensão)
- df[['coluna']] retorna um DataFrame (duas dimensões)

5 Selecionando linhas

5.1 Seleção por índice numérico

penguins.iloc[0]     # Primeira linha (índice 0)
penguins.iloc[10]    # 11ª linha (índice 10)
species                 Adelie
island               Torgersen
bill_length_mm            37.8
bill_depth_mm             17.1
flipper_length_mm        186.0
body_mass_g             3300.0
sex                        NaN
year                      2007
Name: 10, dtype: object

5.2 Seleção de múltiplas linhas

penguins.iloc[0:5]   # Linhas 0 a 4 (5 não incluído)
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 male 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 female 2007
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 female 2007
3 Adelie Torgersen NaN NaN NaN NaN NaN 2007
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 female 2007

6 Seleção combinada: linhas e colunas

penguins.iloc[0:5, 0:3]  # Linhas 0-4, colunas 0-2
species island bill_length_mm
0 Adelie Torgersen 39.1
1 Adelie Torgersen 39.5
2 Adelie Torgersen 40.3
3 Adelie Torgersen NaN
4 Adelie Torgersen 36.7
Nota

Indexação em Python:
- Índices começam em 0
- Intervalos [inicio:fim] não incluem o valor fim
- 0:5 significa índices 0, 1, 2, 3, 4

7 Filtragem de dados

7.1 Filtro simples

filtro = penguins['species'] == 'Adelie'
filtro  # Retorna uma Series de True/False
0       True
1       True
2       True
3       True
4       True
       ...  
339    False
340    False
341    False
342    False
343    False
Name: species, Length: 344, dtype: bool
penguins[filtro]  # Retorna apenas as linhas onde filtro é True
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 male 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 female 2007
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 female 2007
3 Adelie Torgersen NaN NaN NaN NaN NaN 2007
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 female 2007
... ... ... ... ... ... ... ... ...
147 Adelie Dream 36.6 18.4 184.0 3475.0 female 2009
148 Adelie Dream 36.0 17.8 195.0 3450.0 female 2009
149 Adelie Dream 37.8 18.1 193.0 3750.0 male 2009
150 Adelie Dream 36.0 17.1 187.0 3700.0 female 2009
151 Adelie Dream 41.5 18.5 201.0 4000.0 male 2009

152 rows × 8 columns

7.2 Múltiplas condições

Para combinar condições, usamos operadores lógicos:

  • & para E (AND)
  • | para OU (OR)
  • ~ para NÃO (NOT)
filtro2 = (penguins['species'] == 'Adelie') & (penguins['island'] == 'Torgersen')
filtro2
0       True
1       True
2       True
3       True
4       True
       ...  
339    False
340    False
341    False
342    False
343    False
Length: 344, dtype: bool
penguins[filtro2]
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 male 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 female 2007
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 female 2007
3 Adelie Torgersen NaN NaN NaN NaN NaN 2007
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 female 2007
5 Adelie Torgersen 39.3 20.6 190.0 3650.0 male 2007
6 Adelie Torgersen 38.9 17.8 181.0 3625.0 female 2007
7 Adelie Torgersen 39.2 19.6 195.0 4675.0 male 2007
8 Adelie Torgersen 34.1 18.1 193.0 3475.0 NaN 2007
9 Adelie Torgersen 42.0 20.2 190.0 4250.0 NaN 2007
10 Adelie Torgersen 37.8 17.1 186.0 3300.0 NaN 2007
11 Adelie Torgersen 37.8 17.3 180.0 3700.0 NaN 2007
12 Adelie Torgersen 41.1 17.6 182.0 3200.0 female 2007
13 Adelie Torgersen 38.6 21.2 191.0 3800.0 male 2007
14 Adelie Torgersen 34.6 21.1 198.0 4400.0 male 2007
15 Adelie Torgersen 36.6 17.8 185.0 3700.0 female 2007
16 Adelie Torgersen 38.7 19.0 195.0 3450.0 female 2007
17 Adelie Torgersen 42.5 20.7 197.0 4500.0 male 2007
18 Adelie Torgersen 34.4 18.4 184.0 3325.0 female 2007
19 Adelie Torgersen 46.0 21.5 194.0 4200.0 male 2007
68 Adelie Torgersen 35.9 16.6 190.0 3050.0 female 2008
69 Adelie Torgersen 41.8 19.4 198.0 4450.0 male 2008
70 Adelie Torgersen 33.5 19.0 190.0 3600.0 female 2008
71 Adelie Torgersen 39.7 18.4 190.0 3900.0 male 2008
72 Adelie Torgersen 39.6 17.2 196.0 3550.0 female 2008
73 Adelie Torgersen 45.8 18.9 197.0 4150.0 male 2008
74 Adelie Torgersen 35.5 17.5 190.0 3700.0 female 2008
75 Adelie Torgersen 42.8 18.5 195.0 4250.0 male 2008
76 Adelie Torgersen 40.9 16.8 191.0 3700.0 female 2008
77 Adelie Torgersen 37.2 19.4 184.0 3900.0 male 2008
78 Adelie Torgersen 36.2 16.1 187.0 3550.0 female 2008
79 Adelie Torgersen 42.1 19.1 195.0 4000.0 male 2008
80 Adelie Torgersen 34.6 17.2 189.0 3200.0 female 2008
81 Adelie Torgersen 42.9 17.6 196.0 4700.0 male 2008
82 Adelie Torgersen 36.7 18.8 187.0 3800.0 female 2008
83 Adelie Torgersen 35.1 19.4 193.0 4200.0 male 2008
116 Adelie Torgersen 38.6 17.0 188.0 2900.0 female 2009
117 Adelie Torgersen 37.3 20.5 199.0 3775.0 male 2009
118 Adelie Torgersen 35.7 17.0 189.0 3350.0 female 2009
119 Adelie Torgersen 41.1 18.6 189.0 3325.0 male 2009
120 Adelie Torgersen 36.2 17.2 187.0 3150.0 female 2009
121 Adelie Torgersen 37.7 19.8 198.0 3500.0 male 2009
122 Adelie Torgersen 40.2 17.0 176.0 3450.0 female 2009
123 Adelie Torgersen 41.4 18.5 202.0 3875.0 male 2009
124 Adelie Torgersen 35.2 15.9 186.0 3050.0 female 2009
125 Adelie Torgersen 40.6 19.0 199.0 4000.0 male 2009
126 Adelie Torgersen 38.8 17.6 191.0 3275.0 female 2009
127 Adelie Torgersen 41.5 18.3 195.0 4300.0 male 2009
128 Adelie Torgersen 39.0 17.1 191.0 3050.0 female 2009
129 Adelie Torgersen 44.1 18.0 210.0 4000.0 male 2009
130 Adelie Torgersen 38.5 17.9 190.0 3325.0 female 2009
131 Adelie Torgersen 43.1 19.2 197.0 3500.0 male 2009
penguins[filtro2].shape  # Quantas linhas atendem aos critérios
(52, 8)
Aviso

Parênteses são obrigatórios ao combinar condições:
- ✅ (condição1) & (condição2)
- ❌ condição1 & condição2

8 Tratando dados ausentes

8.1 Identificando valores ausentes

penguins.isnull().sum(axis=1)  # Valores ausentes por linha
0      0
1      0
2      0
3      5
4      0
      ..
339    0
340    0
341    0
342    0
343    0
Length: 344, dtype: int64
penguins.isnull().sum(axis=0)  # Valores ausentes por coluna
species               0
island                0
bill_length_mm        2
bill_depth_mm         2
flipper_length_mm     2
body_mass_g           2
sex                  11
year                  0
dtype: int64

8.2 Removendo valores ausentes

penguins2 = penguins.dropna()  # Remove todas as linhas com valores ausentes
penguins2.isnull().sum(axis=0)  # Verifica se ainda há valores ausentes
species              0
island               0
bill_length_mm       0
bill_depth_mm        0
flipper_length_mm    0
body_mass_g          0
sex                  0
year                 0
dtype: int64

9 Métodos úteis para exploração

9.1 Informações gerais

penguins.info()          # Informações gerais sobre o DataFrame
penguins.describe()      # Estatísticas descritivas para colunas numéricas
penguins['species'].unique()        # Valores únicos em uma coluna
penguins['species'].value_counts()  # Contagem de cada valor único
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 344 entries, 0 to 343
Data columns (total 8 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   species            344 non-null    object 
 1   island             344 non-null    object 
 2   bill_length_mm     342 non-null    float64
 3   bill_depth_mm      342 non-null    float64
 4   flipper_length_mm  342 non-null    float64
 5   body_mass_g        342 non-null    float64
 6   sex                333 non-null    object 
 7   year               344 non-null    int64  
dtypes: float64(4), int64(1), object(3)
memory usage: 21.6+ KB
species
Adelie       152
Gentoo       124
Chinstrap     68
Name: count, dtype: int64

9.2 Verificação de dados

penguins.shape           # Dimensões
penguins.columns         # Nomes das colunas
penguins.index           # Índices das linhas
RangeIndex(start=0, stop=344, step=1)

10 Exemplos práticos

10.1 Filtros complexos

# Pinguins Adelie com massa corporal > 4000g
filtro_complexo = (penguins['species'] == 'Adelie') & (penguins['body_mass_g'] > 4000)
penguins_grandes = penguins[filtro_complexo]
print(f"Encontrados {len(penguins_grandes)} pinguins Adelie com massa > 4000g")
Encontrados 35 pinguins Adelie com massa > 4000g

10.2 Seleção específica

# Primeiros 10 pinguins, apenas espécie e massa corporal
penguins.iloc[0:10][['species', 'body_mass_g']]
species body_mass_g
0 Adelie 3750.0
1 Adelie 3800.0
2 Adelie 3250.0
3 Adelie NaN
4 Adelie 3450.0
5 Adelie 3650.0
6 Adelie 3625.0
7 Adelie 4675.0
8 Adelie 3475.0
9 Adelie 4250.0

10.3 Combinando operações

# Pinguins da ilha Biscoe, removendo valores ausentes, apenas colunas numéricas
resultado = (penguins[penguins['island'] == 'Biscoe']
            .dropna()
            [['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']])
resultado.shape
(163, 4)