import pandas as pd
# pip install palmerpenguins
from palmerpenguins import load_penguinsEstrutura e Tipos de Dados em Python
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.
Acompanha este tutorial o Tipos de dados em Python
1 Pacotes necessários
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 colunaspecies 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 Series0 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
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 |
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/False0 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:
¶ E (AND)|para OU (OR)~para NÃO (NOT)
filtro2 = (penguins['species'] == 'Adelie') & (penguins['island'] == 'Torgersen')
filtro20 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)
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 linha0 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 colunaspecies 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 ausentesspecies 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 linhasRangeIndex(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)