3. A BIBLIOTECA PANDAS#

Abrir no Google Colab

Pandas é uma biblioteca de programação em Python que fornece estruturas de dados e ferramentas de análise de dados flexíveis e eficientes. É uma das bibliotecas mais populares e amplamente utilizadas para análise e manipulação de dados em Python. Ele transforma a complexidade da manipulação de dados em tarefas intuitivas, permitindo que o usuário se concentre na análise dos dados ao invés de se preocupar com os aspectos técnicos da preparação de dados. Constituem pontos-chave da Pandas:

  • Estruturas de Dados: A Pandas introduz duas estruturas de dados principais para Python: Series e DataFrame;

  • Manipulação de Dados: Facilita a filtragem seleção, mesclagem e agrupamento de dados. Disponibiliza ainda funções e métodos para efetuar rapidamente operações comuns, como: Manipulação de datas; Ajuste de dados faltantes; Agrupamento e agregação de dados; Fusão e junção de conjuntos de dados;

  • Análise de Dados: Facilita a análise estatística dos dados. Ele integra-se bem com outras bibliotecas de análise de dados e visualização, como numpy, scipy e matplotlib;

  • Importação e Exportação de Dados: Suporta uma ampla variedade de formatos de arquivos, como CSV, Excel, SQL, HDF5, entre outros. Isso torna fácil importar dados para análise e exportar resultados após a análise;

  • Integração: integra-se bem com muitas outras bibliotecas do ecossistema de ciência de dados em Python, como matplotlib para visualização, scikit-learn para aprendizado de máquina e statsmodels para modelagem estatística.

3.1 Introdução e Configurações Básicas#

3.1.1 Configurações iniciais#

Ao iniciar com a biblioteca Pandas, é importante realizar algumas configurações iniciais para garantir que a experiência de análise de dados seja otimizada e alinhada às suas preferências. Abaixo, apresento algumas configurações comuns que os usuários do Pandas frequentemente ajustam:

Importação da Biblioteca: Antes de qualquer coisa, você precisa importar a biblioteca. Pandas é geralmente importado com o alias “pd” por convenção.

import pandas as pd

Configuração do número máximo de linhas e colunas exibidas: Se você estiver trabalhando com DataFrames grandes, pode querer ajustar o número de linhas e colunas exibidas por padrão quando imprimir o DataFrame.

pd.set_option('display.max_rows', 20)
pd.set_option('display.max_columns', 10)

Largura da Coluna e Precisão: Para melhor visualização dos dados, você pode ajustar a largura da coluna e a precisão (número de casas decimais).

pd.set_option('display.max_colwidth', 20)
pd.set_option('display.precision', 2)

Configuração do Float Format: Controla a formatação de números flutuantes. Útil para quando se quer mostrar valores em formato de porcentagem, por exemplo.

pd.options.display.float_format = '{:,.2f}'.format

Evitando Notação Científica: Por padrão, a Pandas pode exibir números grandes ou muito pequenos usando notação científica. Para desativar isso:

pd.set_option('display.float_format', lambda x: '%.2f' % x)

Configurações de Visualização: Se estiver usando o Jupyter Notebook ou Jupyter Lab, para que os plots feitos com Pandas (integrados com Matplotlib) sejam exibidos diretamente no notebook:

%matplotlib inline

Configuração de Data e Hora: Se estiver trabalhando com séries temporais, pode ser útil ajustar a formatação padrão de datas.

pd.set_option('display.date_dayfirst', True)

Configuração do Encoding Padrão: Ao lidar com conjuntos de dados que possuem caracteres especiais ou não-ASCII, configurar o encoding padrão para leitura e escrita de arquivos pode evitar problemas.

pd.set_option('display.encoding', 'UTF-8')

Estas são apenas algumas das opções que você pode configurar ao iniciar com Pandas. Dependendo da natureza de seus dados e suas preferências pessoais, você pode precisar ajustar outras opções. Consulte a documentação da Pandas para uma lista completa de opções configuráveis.

3.1.2 Introdução às estruturas de dados na Pandas#

O domínio das estruturas de dados da Pandas é essencial para qualquer pessoa que deseja trabalhar com análise de dados em Python. Uma vez que você esteja confortável com Series e DataFrame, muitas tarefas complexas de processamento de dados se tornarão mais simples e diretas.

No contexto da biblioteca Pandas, quando falamos de estruturas de dados, nos referimos principalmente a duas estruturas fundamentais: a Series e o DataFrame, que são a base para a maioria das operações de análise de dados em Python. Ambas foram projetadas para facilitar a manipulação de dados em Python, cada uma servindo a diferentes propósitos e possuindo suas características específicas.

Além de Series e DataFrame, a Pandas oferece outras estruturas mais especializadas como Panel (estrutura tridimensional, menos usada) e MultiIndex (para indexação hierárquica).

Series

Series é uma estrutura de dados unidimensional, que pode armazenar valores de qualquer tipo de dado (números, strings, objetos Python, etc.). É, em essência, uma coluna em um DataFrame. Os rótulos dos eixos são chamados de índice.

Uma Series oferece uma variedade de métodos e operações para facilitar a manipulação e análise de dados unidimensionais.

Características Principais:

  • Unidimensionalidade: Series contém uma sequência de itens em uma única dimensão;

  • Index: Cada elemento em uma Series é associado a um índice. Esse índice é, por padrão, uma sequência numérica começando por zero, mas pode ser de outros tipos, como datas, strings ou até mesmo outros números;

  • Homogeneidade: Apesar de uma Series poder conter qualquer tipo de dado, todos os itens em uma única Series devem ser do mesmo tipo. Se diferentes tipos são colocados em uma Series, ela tentará converter os tipos para um formato comum;

  • Nome: Uma Series pode ter um atributo nome, o que pode ser útil especialmente quando a Series é usada como uma coluna em um DataFrame.

Usos Comuns:

  • Seleção de dados: Muitas vezes, quando você seleciona uma única coluna de um DataFrame, o resultado é uma Series;

  • Operações aritméticas: Assim como com arrays do Numpy, é possível realizar operações aritméticas com uma Series;

  • Operações de agregação: Você pode aplicar funções de agregação, como soma, média, mediana, entre outras, diretamente a uma Series;

  • Filtragem: É fácil filtrar dados em uma Series usando operadores condicionais;

  • Aplicação de funções: O método .apply() permite que você aplique uma função a cada item de uma Series.

  • Conversão de tipos: Converta os tipos de dados em uma Series usando o método astype();

  • Manipulação de strings: Se a Series contém strings, a Pandas oferece um conjunto robusto de operações de string através do atributo .str;

  • Tratamento de valores faltantes: Métodos como .fillna() ou .dropna() ajudam a lidar com valores faltantes (NaN) em uma Series.

DataFrame

Um DataFrame é uma estrutura de dados bidimensional, semelhante a uma planilha ou uma tabela de banco de dados, uma planilha do Excel ou uma tabela em linguagens estatísticas como R, que pode armazenar dados de diferentes tipos em suas colunas. O DataFrame é a estrutura central da Pandas e é a ferramenta de escolha para a maioria das operações de análise de dados em Python. Seu design flexível e a grande quantidade de métodos e funcionalidades o tornam ideal para trabalhar com dados em muitos contextos diferentes. Enquanto a Series é essencial e útil em muitos cenários, o DataFrame amplia essa utilidade para operações mais complexas e análises multidimensionais.

Características Principais:

  • Bidimensionalidade: Ao contrário da Series (unidimensional), um DataFrame é bidimensional, representando dados em linhas e colunas; Colunas com Nomes: Cada coluna em um DataFrame tem um nome, que serve como seu identificador;

  • Indexação: Assim como a Series, o DataFrame tem um índice que identifica cada linha. Esse índice pode ser numérico, de data, de string, ou até mesmo hierárquico;

  • Colunas com diferentes tipos de dados: Enquanto uma Series deve ter um tipo de dado único, um DataFrame pode ter diferentes tipos de dados em suas diferentes colunas (por exemplo, inteiros, floats, strings);

  • Flexibilidade: Você pode adicionar ou remover colunas, alterar o índice, reordenar as linhas, entre outras operações;

  • Funcionalidades: A Pandas oferece uma ampla gama de funções e métodos para manipular, filtrar, agrupar, transformar e analisar os dados em um DataFrame;

  • Integração com Outras Bibliotecas: DataFrames podem ser facilmente convertidos para outras estruturas de dados, como arrays do numpy, e são amplamente utilizados em conjunto com outras bibliotecas de análise de dados e visualização, como matplotlib, seaborn e scikit-learn;

  • Importação e Exportação: Com a Pandas, é possível ler dados de diversas fontes, como arquivos CSV, Excel, bancos de dados SQL e muitos outros formatos, diretamente para um DataFrame. Da mesma forma, os dados em um DataFrame podem ser facilmente exportados para esses formatos.

Usos Comuns:

  • Manipulação de dados: Seleção, adição e exclusão de colunas e linhas;

  • Agrupamento: Utilizando o método groupby() é possível agrupar dados com base em certos critérios e aplicar funções de agregação;

  • Mesclagem e junção: Com métodos como merge() e join(), é possível combinar diferentes DataFrames de acordo com critérios específicos;

  • Pivotamento: Transforme dados de formato longo para largo e vice-versa usando métodos como pivot();

  • Visualização: A Pandas integra-se bem com bibliotecas de visualização, como Matplotlib, permitindo a criação de gráficos diretamente de um DataFrame;

  • Estatísticas e análise: Calcule estatísticas básicas, realize testes estatísticos, explore correlações e muito mais; Tratamento de valores faltantes: Use métodos como fillna(), dropna(), e interpolate() para tratar dados faltantes.

Diferenças em Relação às Series:

  • Dimensionalidade: Enquanto uma Series é unidimensional, o DataFrame é bidimensional;

  • Tipos de dados: A Series tem um único tipo de dado para todos os seus elementos, enquanto um DataFrame pode ter colunas com diferentes tipos de dados;

  • Acessibilidade: Em uma Series, acessamos os dados pelo índice. Em um DataFrame, usamos o nome da coluna (ou uma lista de nomes de colunas) para selecionar colunas específicas;

  • Estrutura: Enquanto você pode pensar em uma Series como uma única coluna de dados com índices, um DataFrame é como um conjunto de Series que compartilham um índice comum.

3.1.3 Criação e manipulação de Series#

A criação e a manipulação de Series é um aspecto importante da análise de dados, pois nos permite organizar e trabalhar com sequências de dados de maneira sistemática. Vamos aprender sobre as algumas das ferramentas e técnicas fundamentais para gerenciar e analisar dados em séries.

Vamos criar uma Series a partir de uma lista:

s = pd.Series([1, 2, 3, 4, 5])

A coluna esquerda é o índice da Series (lembre-se que a indexação no Python começa em zero), enquanto a coluna a direita armazena os valores definidos pelo usuário.

Definir um índice personalizado:

s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])

Acessando valores e índices:

s.values  
array([1, 2, 3, 4, 5])
s.index   
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

Operações aritméticas básicas

s + 10  
a    11
b    12
c    13
d    14
e    15
dtype: int64
s * 2  
a     2
b     4
c     6
d     8
e    10
dtype: int64

Indexação e Seleção

Seleção por índice

s['a']  
1

Seleção por posição

s[0]  
1

Seleção condicional

s[s > 2]  
c    3
d    4
e    5
dtype: int64

Fatiamento

s[1:4]  
b    2
c    3
d    4
dtype: int64
s['a':'c']  
a    1
b    2
c    3
dtype: int64

Atribuição de valores

s['a'] = 10  

3.1.4 Criação de DataFrames#

A Pandas facilita a criação de DataFrames a partir de diferentes formatos de dados. Seja um arquivo CSV, uma planilha do Excel, um banco de dados ou até mesmo uma API, a Pandas oferece funcionalidades para transformar essas diversas fontes de informação em estruturas de dados organizadas. Internamente, é possível criar DataFrames a partir de tipos básicos de dados e estruturas de dados. Vamos ver alguns exemplos:

Criação de DataFrame a partir de um dicionário:

dados = {
    'Nome': ['Ana', 'Bruno', 'Carlos'],
    'Idade': [25, 30, 35],
    'Cidade': ['Curitiba', 'Belém', 'Belo Horizonte']
}
df = pd.DataFrame(dados)
df
Nome Idade Cidade
0 Ana 25 Curitiba
1 Bruno 30 Belém
2 Carlos 35 Belo Horizonte

Neste código, primeiro é realizada a importação da biblioteca Pandas com o apelido “pd”. Em seguida, é criado um dicionário chamado “dados”, contendo três pares chave-valor que representam, respectivamente, nomes, idades e cidades de três indivíduos. Por fim, o dicionário é convertido em um DataFrame da Pandas e armazenado na variável “df”. Assim, o DataFrame “df” organiza as informações presentes no dicionário “dados” em forma de tabela, facilitando análises e manipulações posteriores dos dados.

Criação de um DataFrame a partir de uma lista:

nome = ['Ana', 'Bruno', 'Carlos']
idade = [25, 30, 35]
cidade = ['Curitiba', 'Belém', 'Belo Horizonte']
df = pd.DataFrame(list(zip(nome, idade, cidade)), columns=['Nome', 'Idade', 'Cidade'])

Neste código, são definidas três listas: “nome”, “idade” e “cidade”, que contêm, respectivamente, os nomes, idades e cidades de três indivíduos. A função zip é usada para agrupar os elementos correspondentes dessas três listas em tuplas. A função list converte o resultado do zip em uma lista de tuplas, onde cada tupla contém um nome, uma idade e uma cidade. Finalmente, essa lista de tuplas é convertida em um DataFrame, com as colunas nomeadas como ‘Nome’, ‘Idade’ e ‘Cidade’. O resultado é armazenado na variável “df”.

Criação de DataFrames a partir de arquivos:

No contexto do Geoprocessamento, frequentemente lidamos com vastas quantidades de informações armazenadas em diferentes formatos de arquivos, como CSV, Excel, entre outros. A criação de DataFrames a partir de arquivos permite acessar, visualizar e trabalhar com os dados de uma maneira mais organizada e intuitiva. Veremos como criar DataFrames a partir de arquivos externos mais adiante em nosso curso.

3.2 Manipulação e Seleção de Dados#

3.2.1 Seleção e filtragem em DataFrames#

Ao trabalhar com DataFrames na Pandas, uma habilidade importante é a capacidade de selecionar e filtrar dados de forma eficaz. Dado que um DataFrame pode conter grandes quantidades de dados, frequentemente precisamos isolar subconjuntos específicos desses dados para análises mais detalhadas ou operações subsequentes. Seja para extrair colunas específicas, selecionar linhas baseadas em critérios definidos ou combinar ambos os métodos, a Pandas oferece uma variedade de ferramentas intuitivas que tornam essas tarefas simples e diretas.

Estudaremos a seleção e a filtragem de dados na Pandas a partir de exemplos. Vamos começar criando um conjunto de dados (DataFrame):

dados = {
    'Pais': ['Brasil', 'Argentina', 'Chile', 'Uruguai', 'Paraguai', 'Bolívia'],
    'Populacao': [211050000, 45195777, 19116201, 3473727, 7044636, 11513100],
    'Area': [8515767, 2780400, 756102, 176215, 406752, 1098581],  # em km^2
    'PIB_2020': [2.055, 0.389, 0.282, 0.056, 0.038, 0.034]  # PIB em 
    # trilhões de dólares para 2020 (valores aproximados)
}

df = pd.DataFrame(dados)
# Exibindo o DataFrame
print(df)
        Pais  Populacao     Area  PIB_2020
0     Brasil  211050000  8515767      2.06
1  Argentina   45195777  2780400      0.39
2      Chile   19116201   756102      0.28
3    Uruguai    3473727   176215      0.06
4   Paraguai    7044636   406752      0.04
5    Bolívia   11513100  1098581      0.03

Selecionar colunas e linhas específicas

Para selecionar uma única coluna, você pode usar a notação de colchetes com o nome da coluna.

# Selecionando apenas a coluna 'País'
paises = df['Pais']
print(paises)
0       Brasil
1    Argentina
2        Chile
3      Uruguai
4     Paraguai
5      Bolívia
Name: Pais, dtype: object

Para selecionar várias colunas, você pode passar uma lista com os nomes das colunas desejadas:

# Selecionando as colunas 'País' e 'PIB (2020)'
paises_pib = df[['Pais', 'PIB_2020']]
print(paises_pib)
        Pais  PIB_2020
0     Brasil      2.06
1  Argentina      0.39
2      Chile      0.28
3    Uruguai      0.06
4   Paraguai      0.04
5    Bolívia      0.03
  • Usando o método .iloc:

O método iloc da Pandas permite selecionar linhas e colunas em um DataFrame usando índices numéricos. É uma abordagem baseada em posição, o que significa que você se refere às linhas e colunas por seus índices numéricos.

Para selecionar uma única linha, você pode usar a notação de colchetes com o índice da linha.

# Selecionando a terceira linha (índice 2)
linha3 = df.iloc[2]
print(linha3)
Pais            Chile
Populacao    19116201
Area           756102
PIB_2020         0.28
Name: 2, dtype: object

Você pode selecionar várias linhas passando uma lista de índices ou um intervalo de índices. Por exemplo, selecionar as três primeiras linhas do DataFrame:

primeiras_tres = df.iloc[0:3]
print(primeiras_tres)
        Pais  Populacao     Area  PIB_2020
0     Brasil  211050000  8515767      2.06
1  Argentina   45195777  2780400      0.39
2      Chile   19116201   756102      0.28

Para selecionar linhas com índices específicos:

linhas_especificas = df.iloc[[1, 3, 5]]
print(linhas_especificas)
        Pais  Populacao     Area  PIB_2020
1  Argentina   45195777  2780400      0.39
3    Uruguai    3473727   176215      0.06
5    Bolívia   11513100  1098581      0.03

Selecionando Linhas e Colunas Simultaneamente

Com iloc, você também pode selecionar linhas e colunas específicas ao mesmo tempo. Para selecionar uma coluna específica utilizando o método iloc, é necessário fornecer os índices das linhas e da coluna desejada. Se você deseja selecionar toda a coluna “País”, por exemplo, pode fazer o seguinte:

coluna_pais = df.iloc[:, 0]
print(coluna_pais)
0       Brasil
1    Argentina
2        Chile
3      Uruguai
4     Paraguai
5      Bolívia
Name: Pais, dtype: object

Neste código, df.iloc[:, 0] seleciona todas as linhas (indicado pelo “:”) da primeira coluna (índice 0).

Se você quiser especificar tanto as linhas quanto as colunas a serem selecionados, usando o iloc:

selecao = df.iloc[1:4, [0, 3]]
print(selecao)
        Pais  PIB_2020
1  Argentina      0.39
2      Chile      0.28
3    Uruguai      0.06
  • Usando loc (por índices etiquetados ou nomes de colunas)

O método loc da Pandas é usado para selecionar linhas e colunas por seus índices etiquetados (ou rótulos) e nomes de colunas, ao contrário do iloc, que usa índices numéricos. Vamos ver como usar o loc com o nosso DataFrame.

Inicialmente, vamos alterar o DataFrame que utilizamos no estudo do método ‘iloc’, definindo como índice etiquetado (rótulo) o nome do país:

df.set_index('Pais', inplace=True)
print(df)
           Populacao     Area  PIB_2020
Pais                                   
Brasil     211050000  8515767      2.06
Argentina   45195777  2780400      0.39
Chile       19116201   756102      0.28
Uruguai      3473727   176215      0.06
Paraguai     7044636   406752      0.04
Bolívia     11513100  1098581      0.03

O método set_index do DataFrame é usado para definir uma coluna como índice (ou rótulo de linha) do DataFrame. O argumento que você fornece a este método especifica a coluna que você deseja usar como índice. Aqui, estamos indicando que queremos definir a coluna ‘País’ como o índice do DataFrame df. Quando inplace é definido como True, a operação modifica o DataFrame original e não retorna um novo DataFrame. Se inplace for False (ou não fornecido), a operação retornará um novo DataFrame com a alteração, e o DataFrame original não será modificado.

  • Selecionando uma Única Linha

Exemplo: Selecionar a linha com índice ‘Brasil’.

linha_brasil = df.loc['Brasil']
print(linha_brasil)
Populacao   211050000.00
Area          8515767.00
PIB_2020            2.06
Name: Brasil, dtype: float64

Selecionando Múltiplas Linhas

Exemplo: Selecionar as linhas com índices ‘Brasil’, ‘Argentina’ e ‘Chile’.

linhas_selecionadas = df.loc[['Brasil', 'Argentina', 'Chile']]
print(linhas_selecionadas)
           Populacao     Area  PIB_2020
Pais                                   
Brasil     211050000  8515767      2.06
Argentina   45195777  2780400      0.39
Chile       19116201   756102      0.28

Selecionando Linhas e Colunas Simultaneamente

Exemplo: Selecionar as linhas ‘Brasil’ e ‘Argentina’ e as colunas ‘População’ e ‘PIB (2020)’.

selecao = df.loc[['Brasil', 'Argentina'], ['Populacao', 'PIB_2020']]
print(selecao)
           Populacao  PIB_2020
Pais                          
Brasil     211050000      2.06
Argentina   45195777      0.39

Selecionando Todas as Linhas de Colunas Específicas

Exemplo: Selecionar todas as linhas e apenas a coluna ‘Área’.

coluna_area = df.loc[:, 'Area']
print(coluna_area)
Pais
Brasil       8515767
Argentina    2780400
Chile         756102
Uruguai       176215
Paraguai      406752
Bolívia      1098581
Name: Area, dtype: int64

Filtragem de dados com base em condições

Com a Pandas, é possível filtrar um DataFrame baseado em condições específicas aplicadas às colunas.

A filtragem de dados baseada em condições é uma das operações mais comuns ao trabalhar com DataFrames na Pandas. Isso permite que você selecione subconjuntos de dados que atendam a critérios específicos. Vamos explorar como fazer isso.

Vamos utilizar o DataFrame que tem os rótulos das linhas numerados, mas resetando o seu índice.

df.reset_index(inplace=True)
df
Pais Populacao Area PIB_2020
0 Brasil 211050000 8515767 2.06
1 Argentina 45195777 2780400 0.39
2 Chile 19116201 756102 0.28
3 Uruguai 3473727 176215 0.06
4 Paraguai 7044636 406752 0.04
5 Bolívia 11513100 1098581 0.03

Filtragem Simples

Exemplo: selecionar todos os países com uma população maior que 10 milhões.

paises_10M = df[df['Populacao'] > 10000000]
print(paises_10M)
        Pais  Populacao     Area  PIB_2020
0     Brasil  211050000  8515767      2.06
1  Argentina   45195777  2780400      0.39
2      Chile   19116201   756102      0.28
5    Bolívia   11513100  1098581      0.03

Usando Múltiplas Condições:

Se você quiser combinar várias condições, pode usar os operadores “&” (e), “|” (ou) e “ ~ ” (não). Lembre-se de colocar cada condição entre parênteses.

Por exemplo, para selecionar países com uma população maior que 15 milhões e uma área menor que 1 milhão de km2:

filtro = (df['Populacao'] > 15000000) & (df['Area'] < 1000000)
paises_filtrados = df[filtro]
print(paises_filtrados)
    Pais  Populacao    Area  PIB_2020
2  Chile   19116201  756102      0.28

Usando o Método isin:

Se você quiser filtrar com base em uma lista de valores, pode usar o método isin. Por exemplo, para selecionar países que estão na lista ['Brasil', 'Argentina', 'Chile']:

paises_lista = df[df['Pais'].isin(['Brasil', 'Argentina', 'Chile'])]
print(paises_lista)
        Pais  Populacao     Area  PIB_2020
0     Brasil  211050000  8515767      2.06
1  Argentina   45195777  2780400      0.39
2      Chile   19116201   756102      0.28

Filtragem com query

O método query permite filtrar usando uma string de consulta, o que pode ser mais legível em algumas situações. Por exemplo, para selecionar países com uma área menor que 500.000 km2:

paises_grandes_query = df.query('Area < 500000')
print(paises_grandes_query)
       Pais  Populacao    Area  PIB_2020
3   Uruguai    3473727  176215      0.06
4  Paraguai    7044636  406752      0.04

3.2.2 Manipulação de Dados em DataFrames#

A manipulação de dados é uma das principais funcionalidades oferecidas pela Pandas. Com ela, é possível realizar uma ampla variedade de operações para transformar, limpar e analisar seus conjuntos de dados.

Alterando um valor específico

Para alterar um valor específico, você pode usar loc ou iloc. Exemplo:

Alterar a população do Brasil para 203.062.215:

df.loc[df['Pais'] == 'Brasil', 'Populacao'] = 203062512
print(df)
        Pais  Populacao     Area  PIB_2020
0     Brasil  203062512  8515767      2.06
1  Argentina   45195777  2780400      0.39
2      Chile   19116201   756102      0.28
3    Uruguai    3473727   176215      0.06
4   Paraguai    7044636   406752      0.04
5    Bolívia   11513100  1098581      0.03

Alterando valores com base em uma condição

Você pode combinar a filtragem de dados com a atribuição para alterar valores com base em uma condição:

df.loc[df['Populacao'] > 15000000, 'PIB_2020'] += 0.1
df
Pais Populacao Area PIB_2020
0 Brasil 203062512 8515767 2.16
1 Argentina 45195777 2780400 0.49
2 Chile 19116201 756102 0.38
3 Uruguai 3473727 176215 0.06
4 Paraguai 7044636 406752 0.04
5 Bolívia 11513100 1098581 0.03

Neste exemplo, estamos aumentando o PIB (2020) em 100 bilhões (lembrando que o PIB registrado no DataFrame original está em trilhões de dólares) para todos os países com uma população superior a 15 milhões.

Usando o método replace

O método replace é usado para substituir valores específicos. Por exemplo, substituir o nome “Brasil” por “República Federativa do Brasil”:

df['Pais'] = df['Pais'].replace('Brasil', 'República Federativa do Brasil')
print(df)
                  Pais  Populacao     Area  PIB_2020
0  República Federa...  203062512  8515767      2.16
1            Argentina   45195777  2780400      0.49
2                Chile   19116201   756102      0.38
3              Uruguai    3473727   176215      0.06
4             Paraguai    7044636   406752      0.04
5              Bolívia   11513100  1098581      0.03

Alterando valores usando uma função com apply

O método apply permite aplicar uma função a cada elemento de uma coluna ou linha. Por exemplo, aumentar a população de todos os países em 5%:

df['Populacao'] = df['Populacao'].apply(lambda x: int(x * 1.05))
print(df)
                  Pais  Populacao     Area  PIB_2020
0  República Federa...  213215637  8515767      2.16
1            Argentina   47455565  2780400      0.49
2                Chile   20072011   756102      0.38
3              Uruguai    3647413   176215      0.06
4             Paraguai    7396867   406752      0.04
5              Bolívia   12088755  1098581      0.03

Neste exemplo, estamos multiplicando a população de cada país por 1.05, o que resulta em um aumento de 5% na população original.

Redefinindo valores de uma coluna inteira

Por exemplo, redefinir todos os valores da coluna PIB (2020) para zero:

df['PIB_2020'] = 0
print(df)
                  Pais  Populacao     Area  PIB_2020
0  República Federa...  213215637  8515767         0
1            Argentina   47455565  2780400         0
2                Chile   20072011   756102         0
3              Uruguai    3647413   176215         0
4             Paraguai    7396867   406752         0
5              Bolívia   12088755  1098581         0

Estes são apenas alguns exemplos básicos de como alterar valores em um DataFrame da Pandas. A biblioteca oferece uma ampla variedade de métodos e funcionalidades que permitem manipular e transformar dados de maneira eficiente.

Adicionando e removendo colunas

Em muitas situações de análise e manipulação de dados, é comum a necessidade de ajustar a estrutura dos conjuntos de dados para melhor atender aos requisitos do projeto. No contexto dos DataFrames da Pandas, essa flexibilidade é amplamente facilitada através de métodos que permitem adicionar novas colunas, seja com base em cálculos, combinações ou informações externas, bem como remover colunas que podem não ser relevantes para a análise subsequente. Vamos aplicar alguns dos principais métodos a partir de exemplos:

Adicionar uma nova coluna:

Para adicionar uma nova coluna com valores padrão:

df['NovaColuna'] = 'Valor Padrão'

df['Continente'] = 'América do Sul'
print(df)
                  Pais  Populacao     Area  PIB_2020      Continente
0  República Federa...  213215637  8515767         0  América do Sul
1            Argentina   47455565  2780400         0  América do Sul
2                Chile   20072011   756102         0  América do Sul
3              Uruguai    3647413   176215         0  América do Sul
4             Paraguai    7396867   406752         0  América do Sul
5              Bolívia   12088755  1098581         0  América do Sul

Remover uma coluna:

Para remover uma coluna:

df.drop('Continente', axis=1, inplace=True)
print(df)
                  Pais  Populacao     Area  PIB_2020
0  República Federa...  213215637  8515767         0
1            Argentina   47455565  2780400         0
2                Chile   20072011   756102         0
3              Uruguai    3647413   176215         0
4             Paraguai    7396867   406752         0
5              Bolívia   12088755  1098581         0

O método drop da Pandas é usado para remover linhas ou colunas de um DataFrame. No código fornecido, o método está sendo aplicado para remover uma coluna:

“Continente”: é o nome da coluna que você deseja remover.

“axis=1”: especifica que a operação deve ser realizada nas colunas. Se você estivesse removendo uma linha, usaria axis=0.

“inplace=True”: essa opção significa que a alteração será aplicada diretamente no DataFrame df, sem necessidade de reatribuição. Se inplace fosse definido como False (ou omitido, já que o padrão é False), o método retornaria um novo DataFrame com a coluna removida, mas o DataFrame original df permaneceria inalterado.

Adicionar uma coluna com base em outras colunas:

Exemplo 1: adicionar uma coluna que seja a razão entre a população e a área.

df['densidade_populacional'] = df['Populacao'] / df['Area']
print(df)
                  Pais  Populacao     Area  PIB_2020  densidade_populacional
0  República Federa...  213215637  8515767         0                25.04   
1            Argentina   47455565  2780400         0                17.07   
2                Chile   20072011   756102         0                26.55   
3              Uruguai    3647413   176215         0                20.70   
4             Paraguai    7396867   406752         0                18.19   
5              Bolívia   12088755  1098581         0                11.00   

Exemplo 2: Adicionar uma coluna que seja a relação entre o PIB e o número de habitantes:

df['renda_per_capita'] = df['PIB_2020'] * 1e12 / df['Populacao']
print(df)
                  Pais  Populacao     Area  PIB_2020  densidade_populacional  \
0  República Federa...  213215637  8515767         0                25.04      
1            Argentina   47455565  2780400         0                17.07      
2                Chile   20072011   756102         0                26.55      
3              Uruguai    3647413   176215         0                20.70      
4             Paraguai    7396867   406752         0                18.19      
5              Bolívia   12088755  1098581         0                11.00      

   renda_per_capita  
0              0.00  
1              0.00  
2              0.00  
3              0.00  
4              0.00  
5              0.00  

Remover múltiplas colunas

Para remover várias colunas:

df.drop(['densidade_populacional', 'renda_per_capita'], axis=1, inplace=True)
print(df)
                  Pais  Populacao     Area  PIB_2020
0  República Federa...  213215637  8515767         0
1            Argentina   47455565  2780400         0
2                Chile   20072011   756102         0
3              Uruguai    3647413   176215         0
4             Paraguai    7396867   406752         0
5              Bolívia   12088755  1098581         0

Adicionar colunas usando assign

O método assign permite adicionar uma ou mais colunas ao DataFrame:

df = df.assign(
    Densidade_Populacional = df['Populacao'] / df['Area'],
    PIB_Per_Capita = df['PIB_2020'] * 1e12 / df['Populacao']
)
print(df)
                  Pais  Populacao     Area  PIB_2020  Densidade_Populacional  \
0  República Federa...  213215637  8515767         0                25.04      
1            Argentina   47455565  2780400         0                17.07      
2                Chile   20072011   756102         0                26.55      
3              Uruguai    3647413   176215         0                20.70      
4             Paraguai    7396867   406752         0                18.19      
5              Bolívia   12088755  1098581         0                11.00      

   PIB_Per_Capita  
0            0.00  
1            0.00  
2            0.00  
3            0.00  
4            0.00  
5            0.00  

Adicionar colunas em locais específicos

Para adicionar uma coluna em uma posição específica, é possível usar o método insert:

df.insert(loc=1, column='Continente', value='América do Sul')
print(df)
                  Pais      Continente  Populacao     Area  PIB_2020  \
0  República Federa...  América do Sul  213215637  8515767         0   
1            Argentina  América do Sul   47455565  2780400         0   
2                Chile  América do Sul   20072011   756102         0   
3              Uruguai  América do Sul    3647413   176215         0   
4             Paraguai  América do Sul    7396867   406752         0   
5              Bolívia  América do Sul   12088755  1098581         0   

   Densidade_Populacional  PIB_Per_Capita  
0                25.04               0.00  
1                17.07               0.00  
2                26.55               0.00  
3                20.70               0.00  
4                18.19               0.00  
5                11.00               0.00  

Os argumentos fornecidos ao método insert fazem o seguinte:

  • loc=1: Especifica a posição (ou índice) onde a nova coluna deve ser inserida. Neste caso, a nova coluna será inserida na posição 1 (lembrando que a indexação começa em 0). Portanto, a nova coluna será a segunda coluna no DataFrame.

  • column=’Continente’: Define o nome da nova coluna como ‘Continente’.

  • value=’América do Sul’: Especifica o valor que será preenchido em todas as linhas dessa nova coluna. Aqui, todas as linhas da coluna ‘Continente’ terão o valor ‘América do Sul’.

Neste exemplo, a nova coluna foi inserida na segunda posição (lembre-se que a indexação no Python começa em zero).

Estes são apenas alguns exemplos básicos de como adicionar e remover colunas em um DataFrame da Pandas. A biblioteca oferece uma ampla variedade de métodos e funcionalidades que permitem manipular e transformar dados de maneira eficiente.

3.2.3 Manipulação de índices#

Índices são essenciais na Pandas, pois permitem acesso rápido a linhas e colunas, facilitam a organização dos dados e são úteis para operações como junções. Já utilizamos métodos para manipulação de índices nos exemplos anteriores. Nesta seção, vamos dar continuidade ao seu estudo. Para tanto, vamos utilizar o mesmo DataFrame dos exemplos anteriores:

dados = {
    'Pais': ['Brasil', 'Argentina', 'Chile', 'Uruguai', 'Paraguai', 'Bolívia'],
    'Populacao': [211050000, 45195777, 19116201, 3473727, 7044636, 11513100],
    'Area': [8515767, 2780400, 756102, 176215, 406752, 1098581],  # em km^2
    'PIB_2020': [2.055, 0.389, 0.282, 0.056, 0.038, 0.034]  # PIB em 
    # trilhões de dólares para 2020 (valores aproximados)
}

df = pd.DataFrame(dados)
print(df)
        Pais  Populacao     Area  PIB_2020
0     Brasil  211050000  8515767      2.06
1  Argentina   45195777  2780400      0.39
2      Chile   19116201   756102      0.28
3    Uruguai    3473727   176215      0.06
4   Paraguai    7044636   406752      0.04
5    Bolívia   11513100  1098581      0.03

Definindo uma coluna como índice

Para definir a coluna “País” como índice:

df = df.set_index('Pais')
print(df)
           Populacao     Area  PIB_2020
Pais                                   
Brasil     211050000  8515767      2.06
Argentina   45195777  2780400      0.39
Chile       19116201   756102      0.28
Uruguai      3473727   176215      0.06
Paraguai     7044636   406752      0.04
Bolívia     11513100  1098581      0.03

Renomeando índices

Renomear o índice “Uruguai” para “República Oriental do Uruguai”:

df = df.rename(index={'Uruguai': 'República Oriental do Uruguai'})
print(df)
                      Populacao     Area  PIB_2020
Pais                                              
Brasil                211050000  8515767      2.06
Argentina              45195777  2780400      0.39
Chile                  19116201   756102      0.28
República Orienta...    3473727   176215      0.06
Paraguai                7044636   406752      0.04
Bolívia                11513100  1098581      0.03

Selecionando linhas por índice

Para selecionar os dados referentes ao Chile:

chile_dados = df.loc['Chile'] 
print(chile_dados) 
Populacao   19116201.00
Area          756102.00
PIB_2020           0.28
Name: Chile, dtype: float64

Removendo linhas por índice

Para remover os dados referentes a Argentina:

df = df.drop('Argentina')
print(df)
                      Populacao     Area  PIB_2020
Pais                                              
Brasil                211050000  8515767      2.06
Chile                  19116201   756102      0.28
República Orienta...    3473727   176215      0.06
Paraguai                7044636   406752      0.04
Bolívia                11513100  1098581      0.03

Verificando a existência de índices

Para verificar se o Brasil está no índice:

print('Brasil' in df.index)
True

Para verificar se a Argentina está no índice:

print('Argentina' in df.index)
False

Alterando a ordem dos índices

Para ordenar os países em ordem alfabética decrescente:

df = df.sort_index(ascending=False)
print(df)
                      Populacao     Area  PIB_2020
Pais                                              
República Orienta...    3473727   176215      0.06
Paraguai                7044636   406752      0.04
Chile                  19116201   756102      0.28
Brasil                211050000  8515767      2.06
Bolívia                11513100  1098581      0.03

3.2.4 Operações aritméticas com DataFrames#

As operações aritméticas com DataFrames são componentes essenciais da análise de dados. Essas operações podem ser realizadas entre colunas de um único DataFrame, entre Series e DataFrames, ou entre dois DataFrames. Abaixo, você encontrará os principais tópicos relacionados a operações aritméticas com DataFrames na Pandas:

Operações Escalares

Exemplo: Aplicar uma operação aritmética entre um DataFrame e um escalar (multiplicar todos os valores do DataFrame por 10): Inicialmente, vamos criar um DataFrame:

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

Em seguida, aplicamos a multiplicação:

df * 10  # Multiplica todos os elementos por 10
A B
0 10 40
1 20 50
2 30 60

Operações entre Series e DataFrames

Por padrão, ao realizar uma operação entre uma Series e um DataFrame, a Pandas tentará fazer a operação ao longo do índice (para cada linha):

s = pd.Series([1, 2, 3], index=['A', 'B', 'C'])
df - s  # Subtrai a Series de cada linha do DataFrame
A B C
0 0 2 NaN
1 1 3 NaN
2 2 4 NaN

No código acima, “s” é uma Series da Pandas que contém três elementos com índices ‘A’, ‘B’ e ‘C’. Ao realizar a operação “df – s”, a Pandas tentará subtrair os valores da Series “s” de cada linha do DataFrame df com base nos índices correspondentes. A subtração é feita elemento a elemento, alinhando os índices da Series com as colunas do DataFrame. Para o DataFrame df e a Series “s” fornecidos, a subtração seria:

Observe que a coluna ‘C’ no resultado é preenchida com NaN (Not a Number), porque o DataFrame df não tem uma coluna ‘C’, e a Pandas introduz valores NaN quando não consegue encontrar um valor correspondente para a operação.

Operações entre DataFrames

Quando se realizam operações entre DataFrames, a Pandas alinha os DataFrames pelos índices e pelas colunas:

df1 = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})
df2 = pd.DataFrame({
    'A': [7, 8, 9],
    'B': [10, 11, 12]
})
df1 + df2  # Realiza a soma elemento a elemento
A B
0 8 14
1 10 16
2 12 18

Operações com Métodos Específicos

A Pandas também oferece métodos específicos que proporcionam mais controle sobre as operações aritméticas. Por exemplo, o método .add():

df1.add(df2, fill_value=0)  
A B
0 8 14
1 10 16
2 12 18

Nesse código, fill_value=0 faz com que registros NaN, caso existam, sejam substituídos por 0 antes da operação. Saída:

Operações com Funções Agregadas

Para aplicar funções que agregam dados, como soma, média e contagem, você pode usar métodos como .sum(), .mean() e .count(), respectivamente.

Para o DataFrame df:

Aplicar:

df.sum()
A     6
B    15
dtype: int64

Aplicar:

df.count()
A    3
B    3
dtype: int64

Existem três registros em cada coluna.

Operações ao longo de um Eixo Específico

Suponha que você queira subtrair a média de cada coluna de todos os valores dessa coluna. Você pode usar o método .sub() e especificar o eixo:

df.sub(df.mean(axis=1), axis=0)
A B
0 -1.50 1.50
1 -1.50 1.50
2 -1.50 1.50

Nesse código, df1.mean(axis=1) calcula a média dos valores ao longo do eixo horizontal (ao longo das colunas) para cada linha. O resultado é uma Series onde o seu índice corresponde ao índice das linhas do DataFrame df1 e os valores são as médias calculadas para cada linha.

Continuando com o código acima, df1.sub(df1.mean(axis=1), axis=0) subtrai os valores da Series resultante da etapa anterior de cada coluna do DataFrame df1. O parâmetro axis=0 indica que a operação de subtração deve ser realizada verticalmente (ao longo das linhas). Isso significa que cada valor da Series (a média de cada linha) será subtraído de cada valor na coluna correspondente do DataFrame. P

Operações utilizando o método applymap

O método applymap() é usado em DataFrames da Pandas para aplicar uma função a todos os elementos do DataFrame. Ele é particularmente útil quando você deseja realizar uma operação ou transformação elemento a elemento em todo o DataFrame.

Ao contrário de outros métodos, como apply(), que trabalham ao longo de eixos (linhas ou colunas), o applymap() opera em cada elemento do DataFrame, um por um. Você fornece a função que deseja aplicar como argumento para o applymap(). Esta função é então aplicada a cada elemento do DataFrame.

Vamos ver um exemplo simples para ilustrar o uso do applymap(): Suponha que você tenha um DataFrame com valores numéricos e deseje formatá-los como strings com duas casas decimais:

# Criando um DataFrame de exemplo
df = pd.DataFrame({
    'A': [1.2345, 2.3456],
    'B': [3.4567, 4.5678]
})

Usando applymap() para formatar todos os números para duas casas decimais:

df_formatado = df.applymap(lambda x: "{:.2f}".format(x))
df_formatado
A B
0 1.23 3.46
1 2.35 4.57

Em Series, você pode usar .map() para operações elemento a elemento ou .apply() para operações que produzem um resultado agregado. Lembre-se de que, quando os índices ou as colunas dos objetos envolvidos na operação não se alinham perfeitamente, a Pandas introduzirá valores NaN nos locais onde os dados estão faltando. Assim, é importante estar atento ao tratamento desses valores após operações aritméticas.

3.2.5 Tratamento de dados ausentes ou faltantes#

O tratamento de dados ausentes é uma etapa crucial na preparação e limpeza de dados. Dados ausentes podem surgir por diversas razões, como falhas na coleta de dados, erros na entrada ou simplesmente porque a informação não estava disponível. A Pandas fornece várias ferramentas para lidar com esses valores ausentes.

O tratamento adequado de dados ausentes depende do contexto e da natureza dos dados. Em alguns casos, pode ser apropriado preencher valores ausentes, enquanto em outros, pode ser melhor excluir registros ou até mesmo imputar valores com base em outras informações.

Inicialmente, vamos criar um DataFrame com 4 colunas e 8 linhas, utilizando tanto valores numéricos quanto valores NaN (Not a Number) para representar dados faltantes em três das quatro colunas. Os dados faltantes serão criados utilizando np.NaN, que é uma constante especial definida na biblioteca Numpy que representa um valor “Not a Number”. Em termos práticos, é usado para denotar a ausência de um valor ou dados faltantes em arrays e DataFrames.

Para o estudo do tratamento de dados ausentes, vamos utilizar um DataFrame criado a partir de um dicionário:

import numpy as np

data = {
    'A': [1, 2, 3, 4, 5, 6, 7, 8],
    'B': [np.nan, 9, 10, np.nan, 12, 13, 14, np.nan],
    'C': [16, np.nan, 18, 19, 20, np.nan, 22, 23],
    'D': [np.nan, 25, np.nan, 27, np.nan, 29, np.nan, 31]
}
df = pd.DataFrame(data)
print(df)
   A     B     C     D
0  1   NaN 16.00   NaN
1  2  9.00   NaN 25.00
2  3 10.00 18.00   NaN
3  4   NaN 19.00 27.00
4  5 12.00 20.00   NaN
5  6 13.00   NaN 29.00
6  7 14.00 22.00   NaN
7  8   NaN 23.00 31.00

Identificação de dados ausentes

A Pandas utiliza o valor NaN (Not a Number) para representar dados ausentes. Você pode identificar esses valores usando o método isna() ou isnull(), ambos retornam o mesmo resultado: um DataFrame de mesma dimensão com valores booleanos (True ou False) indicando a presença de valores faltantes.

print(df.isna())
       A      B      C      D
0  False   True  False   True
1  False  False   True  False
2  False  False  False   True
3  False   True  False  False
4  False  False  False   True
5  False  False   True  False
6  False  False  False   True
7  False   True  False  False
print(df.isnull())
       A      B      C      D
0  False   True  False   True
1  False  False   True  False
2  False  False  False   True
3  False   True  False  False
4  False  False  False   True
5  False  False   True  False
6  False  False  False   True
7  False   True  False  False

Para contar o número de valores faltantes por coluna:

print(df.isna().sum())
A    0
B    3
C    2
D    4
dtype: int64

Para contar o total de valores faltantes no DataFrame inteiro:

print(df.isna().sum().sum())
9

Estratégias para tratamento de dados faltantes: exclusão e imputação

O tratamento de dados faltantes é uma etapa importante na análise e preparação de dados, especialmente porque a presença de valores faltantes pode distorcer análises. Existem várias estratégias para lidar com dados faltantes, e a escolha da estratégia adequada geralmente depende do contexto e da natureza dos dados. Vamos explorar duas categorias principais: exclusão e imputação.

  • Exclusão de dados ausentes

A exclusão de dados ausentes em um DataFrame é uma abordagem que pode ser aplicada tanto às linhas quanto às colunas. Dependendo da natureza e da quantidade de dados ausentes, você pode optar por remover registros inteiros (linhas) ou características específicas (colunas) para manter a integridade e a qualidade dos dados analisados.

A exclusão de linhas com valores faltantes é atrativa devido à sua simplicidade e rapidez de implementação. Além disso, ao evitar suposições ou imputações, a exclusão mantém a pureza dos dados. No entanto, essa abordagem não está isenta de desvantagens. A remoção de registros pode levar à perda significativa de informações, particularmente em conjuntos de dados onde a ausência de valores é comum. Adicionalmente, se os valores ausentes em um conjunto de dados não forem aleatoriamente distribuídos, a exclusão pode introduzir um viés, potencialmente levando a interpretações distorcidas ou análises imprecisas.

O método .dropna() é uma função da biblioteca Pandas, utilizada para tratar dados faltantes em DataFrames. Ao aplicá-lo, todas as linhas que contêm pelo menos um valor faltante (NaN ou None) são excluídas do DataFrame. Por padrão, a operação é feita nas linhas, ou seja, se qualquer valor em uma linha for NaN ou None, toda a linha será removida. É importante notar que, a menos que o argumento inplace=True seja especificado, o método dropna() retornará um novo DataFrame com os valores faltantes removidos, sem alterar o DataFrame original.

Vamos aplicar o método dropna() em nosso DataFrame df:

df.dropna()  # Remove linhas com qualquer valor faltante
A B C D

No caso de nosso DataFrame, como havia dados faltantes em todas as linhas, em pelo menos uma coluna, todos os dados foram removidos, resultando em um DataFrame vazio.

A exclusão de colunas é uma estratégia considerada quando se depara com atributos que possuem uma quantidade significativa de valores faltantes. Esta abordagem pode ser especialmente útil quando uma coluna tem uma proporção tão alta de dados ausentes que a tentativa de imputação ou interpretação se torna inviável ou pouco confiável. No entanto, optar por descartar uma coluna inteira traz o risco de perder uma característica potencialmente relevante para a análise. É crucial ponderar a relevância da informação contida na coluna e o impacto de sua perda no contexto da análise ou modelo em questão.

Se você desejar remover colunas que contêm valores faltantes utilizando o método dropna(), pode usar o argumento axis=1. Ao fazer isso, todas as colunas que contêm pelo menos um valor faltante serão excluídas:

df.dropna(axis=1)  # Remove colunas com qualquer valor faltante
A
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8

No caso do nosso DataFrame df, somente a coluna “A “não possuía dados faltantes. Logo, o DataFrame (agora, uma Series) resultante tem somente os dados dessa coluna.

  • Imputação

A imputação é uma técnica fundamental no pré-processamento de dados para tratar valores faltantes. Dentre as abordagens mais populares para realizá-la, podemos citar: a) a imputação com valor constante; b) a imputação com média, mediana ou moda; c) a interpolação e; d) a imputação utilizando métodos avançados. Vamos detalhar essas abordagens a seguir.

Imputação com Valor Constante

A imputação com valor constante é uma abordagem na qual os valores faltantes são substituídos por um valor fixo, determinado previamente. Esta técnica é simples e rápida, sendo atraente em cenários onde se deseja uma solução imediata. No entanto, há ressalvas a serem consideradas. Substituir dados ausentes por um valor constante pode não refletir a realidade do conjunto de dados, especialmente se os valores ausentes não forem aleatórios. Além disso, essa estratégia pode introduzir distorções, alterando a distribuição original dos dados e potencialmente levando a interpretações errôneas.

O método fillna() da Pandas é utilizado para preencher valores faltantes (representados como NaN) em um DataFrame ou Series. Vamos aplicá-lo em nosso DataFrame df:

df.fillna(0)
A B C D
0 1 0.00 16.00 0.00
1 2 9.00 0.00 25.00
2 3 10.00 18.00 0.00
3 4 0.00 19.00 27.00
4 5 12.00 20.00 0.00
5 6 13.00 0.00 29.00
6 7 14.00 22.00 0.00
7 8 0.00 23.00 31.00

Ao usar df.fillna(0), você está instruindo a Pandas a substituir todos os valores faltantes no DataFrame df pelo número zero. Em outras palavras, qualquer entrada que seja NaN no DataFrame original será substituída por zero na saída resultante.

Imputação com média, mediana ou moda

A utilização de métodos que levam em consideração a distribuição dos dados para tratar valores faltantes normalmente é uma opção mais refinada. Esta abordagem, que pode envolver o uso da média, mediana ou moda, tende a ser mais realista do que simplesmente substituir os valores ausentes por uma constante arbitrária, pois baseia-se na tendência central dos dados disponíveis. No entanto, nem sempre é a solução ideal.

Em conjuntos de dados com distribuições altamente enviesadas ou com uma quantidade significativa de outliers (valores ou pontos em um conjunto de dados que se desviam significativamente dos outros pontos e, por isso, são considerados anômalos), essa técnica pode não ser a mais apropriada, já que a substituição de valores faltantes baseada nessas métricas pode não representar adequadamente a característica intrínseca do conjunto de dados.

Vamos aplicar uma imputação com a média em nosso DataFrame df:

df.fillna(df.mean())
A B C D
0 1 11.60 16.00 28.00
1 2 9.00 19.67 25.00
2 3 10.00 18.00 28.00
3 4 11.60 19.00 27.00
4 5 12.00 20.00 28.00
5 6 13.00 19.67 29.00
6 7 14.00 22.00 28.00
7 8 11.60 23.00 31.00

Ao usar df.fillna(df.mean()), você está instruindo a Pandas a substituir todos os valores faltantes no DataFrame df pela média da respectiva coluna em que o valor faltante está localizado. Para ser mais específico, se uma coluna do DataFrame tiver algum valor faltante, esse valor será substituído pela média de todos os outros valores (não faltantes) da mesma coluna.

  • Interpolação

A interpolação é especialmente útil em séries temporais ou dados sequenciais. A interpolação estima valores faltantes com base nos valores existentes antes e depois do ponto faltante. Por exemplo, em uma série temporal, se tivermos valores para os dias 1, 2 e 4, mas o dia 3 estiver faltando, a interpolação pode ser usada para estimar o valor para o dia 3 com base nos valores dos dias 2 e 4. Existem vários métodos de interpolação, desde técnicas lineares simples até métodos mais complexos, como interpolação polinomial ou spline. A escolha do método de interpolação deve ser feita considerando a natureza dos dados e o padrão subjacente que se acredita existir na sequência. Vamos aplicar a interpolação ao nosso DataFrame df:

df.interpolate()
A B C D
0 1 NaN 16.00 NaN
1 2 9.00 17.00 25.00
2 3 10.00 18.00 26.00
3 4 11.00 19.00 27.00
4 5 12.00 20.00 28.00
5 6 13.00 21.00 29.00
6 7 14.00 22.00 30.00
7 8 14.00 23.00 31.00

A função interpolate() da Pandas utiliza, por padrão, um método de interpolação linear para preencher os valores NaN. No entanto, ela não consegue interpolar os valores NaN que estão nas extremidades do DataFrame (primeira e última linhas), pois não há dados adjacentes de um dos lados para calcular a interpolação.

Para lidar com valores NaN nas extremidades, você pode considerar outras abordagens, como: preencher com um valor constante, preencher com a média da coluna ou aplicar métodos como bfill ou ffill.

  • Imputação com Métodos Avançados

Existem métodos de imputação de dados mais avançados, como a imputação KNN (K-Nearest Neighbors), imputação por regressão e algoritmos como o MICE (Multiple Imputation by Chained Equations). Embora esses métodos possam oferecer uma precisão superior em comparação com abordagens mais simples, eles são computacionalmente mais intensivos e demandam uma compreensão mais profunda por parte do usuário.

As vantagens incluem a potencial precisão elevada, enquanto as desvantagens giram em torno da sua complexidade e da necessidade de um maior poder computacional. Além disso, a implementação correta requer conhecimento adicional.

3.2.6 Agrupamento e Agregação de Dados#

O agrupamento e a agregação de dados são técnicas importantes para analisar e resumir grandes conjuntos de dados. Elas permitem que você segmente seus dados em grupos e aplique funções de resumo a cada grupo, facilitando a identificação de padrões e tendências. Neste capítulo, exploraremos como realizar essas operações usando a biblioteca Pandas em Python. Para tanto vamos criar um DataFrame com dados sobre imagens de satélite:

paises_dados = {
    'Pais': ['Argentina', 'Bolívia', 'Brasil', 'Chile', 'Colômbia', 'Equador', 'Guiana', 'Paraguai', 'Peru', 'Suriname', 'Uruguai', 'Venezuela'],
    'Populacao': [45195777, 11513100, 211050000, 19116201, 50882891, 17643054, 786552, 7044636, 32971854, 586632, 3473727, 28435940],
    'Area': [2780400, 1098581, 8515767, 756102, 1141748, 283561, 214969, 406752, 1285216, 163821, 176215, 912050],
    'Independencia': ['1816-07-09', '1825-08-06', '1822-09-07', '1818-02-12', '1810-07-20', '1822-05-24', '1966-05-26', '1811-05-14', '1821-07-28', '1975-11-25', '1825-08-25', '1811-07-05']
}
df = pd.DataFrame(paises_dados)
df
Pais Populacao Area Independencia
0 Argentina 45195777 2780400 1816-07-09
1 Bolívia 11513100 1098581 1825-08-06
2 Brasil 211050000 8515767 1822-09-07
3 Chile 19116201 756102 1818-02-12
4 Colômbia 50882891 1141748 1810-07-20
5 Equador 17643054 283561 1822-05-24
6 Guiana 786552 214969 1966-05-26
7 Paraguai 7044636 406752 1811-05-14
8 Peru 32971854 1285216 1821-07-28
9 Suriname 586632 163821 1975-11-25
10 Uruguai 3473727 176215 1825-08-25
11 Venezuela 28435940 912050 1811-07-05

Funções de agregação

As funções de agregação proporcionam um resumo estatístico ou uma redução dos dados. Quando você tem um grande conjunto de dados e quer obter informações resumidas ou insights gerais, as funções de agregação são muito úteis. No Python, especialmente com a Pandas, temos várias funções de agregação à disposição.

Algumas das funções de agregação mais comuns são:

min() e max(): Retorna os valores mínimo e máximo registrado em cada coluna no DataFrame, respectivamente.

df['Area'].min()
163821
df['Area'].max()
8515767

sum(): Calcula a soma total de uma coluna.

df['Populacao'].sum()
428700364

mean(): Calcula a média aritmética.

df['Populacao'].mean()
35725030.333333336

median(): Retorna a mediana de uma coluna ordenada.

df['Populacao'].median()
18379627.5

std(): Calcula o desvio padrão, que é uma medida de dispersão dos dados.

df['Populacao'].std()
57703124.3291084

var(): Calcula a variância dos dados.

df['Populacao'].var()
3329650557340542.0

quantile(): Retorna valores em percentis específicos de uma coluna.

df['Populacao'].quantile(0.25)  
6151908.75

Count(): Conta o número de itens não nulos.

df['Pais'].count()
12

nunique(): Conta o número de valores únicos em uma coluna.

df['Pais'].nunique()
12

unique(): Retorna um array dos valores únicos.

df['Pais'].unique()
array(['Argentina', 'Bolívia', 'Brasil', 'Chile', 'Colômbia', 'Equador',
       'Guiana', 'Paraguai', 'Peru', 'Suriname', 'Uruguai', 'Venezuela'],
      dtype=object)

agg() ou aggregate(): Permite aplicar várias funções de agregação ao mesmo tempo ou especificar funções de agregação para colunas específicas.

df.agg({'Populacao': 'sum', 'Area': 'mean'})
Populacao   428700364.00
Area          1477931.83
dtype: float64

Método Groupby

O método groupby é uma ferramenta da Pandas que permite agrupar dados com base em algumas colunas e, em seguida, aplicar uma função (como soma, média, contagem, etc.) a cada grupo. Esse método é especialmente útil para segmentar um DataFrame em subconjuntos de dados para análise. Ele opera em três etapas fundamentais: Dividir, Aplicar e Combinar.

a) Dividir: Nesta etapa, o DataFrame é dividido em grupos com base em uma ou mais colunas especificadas. Cada grupo é um subconjunto do DataFrame que tem o mesmo valor na coluna (ou colunas) especificada(s);

b) Aplicar: Uma vez que os dados são agrupados, uma função é aplicada a cada grupo individualmente. Esta função pode ser uma operação de agregação (como calcular a média, a soma, a contagem, etc.), uma transformação (como normalizações ou cálculos mais complexos) ou qualquer outra operação que você queira realizar em grupos específicos;

c) Combinar: Após aplicar a função a cada grupo, a Pandas combina os resultados em uma nova estrutura, geralmente um DataFrame. O resultado é um DataFrame reformulado, onde os índices são os valores únicos das colunas usadas para agrupar e as colunas contêm os resultados das funções aplicadas.

Exemplos:

Inicialmente, vamos criar um DataFrame:

dados = {
    'Imagem': ['Landsat 8', 'Sentinel-2', 'Landsat 8', 'WorldView-3', 'Sentinel-2', 'WorldView-3', 'Landsat 8', 'Sentinel-2'],
    'Regiao': ['Amazônia', 'Cerrado', 'Pantanal', 'Pantanal', 'Amazônia',
    'Caatinga', 'Caatinga', 'Cerrado'],
    'Area_coberta': [1000, 1500, 2000, 500, 3000, 750, 1250, 1750],
    'Custo': [5000, 10000, 15000, 50000, 25000, 70000, 7500, 15000]
}

df = pd.DataFrame(dados)
print(df)
        Imagem    Regiao  Area_coberta  Custo
0    Landsat 8  Amazônia          1000   5000
1   Sentinel-2   Cerrado          1500  10000
2    Landsat 8  Pantanal          2000  15000
3  WorldView-3  Pantanal           500  50000
4   Sentinel-2  Amazônia          3000  25000
5  WorldView-3  Caatinga           750  70000
6    Landsat 8  Caatinga          1250   7500
7   Sentinel-2   Cerrado          1750  15000

Agrupar os dados por ‘Imagem’ e obter a soma da ‘Área Coberta (km²)’ para cada tipo de imagem:

df.groupby('Imagem')['Area_coberta'].sum()
Imagem
Landsat 8      4250
Sentinel-2     6250
WorldView-3    1250
Name: Area_coberta, dtype: int64

Agrupar os dados por ‘Região’ e calcular a média do ‘Custo (R$)’:

df.groupby('Regiao')['Custo'].mean()
Regiao
Amazônia   15000.00
Caatinga   38750.00
Cerrado    12500.00
Pantanal   32500.00
Name: Custo, dtype: float64

Agrupar os dados por ‘Imagem’ e ‘Região’ e obter a contagem de registros para cada combinação:

df.groupby(['Imagem', 'Regiao']).size()
Imagem       Regiao  
Landsat 8    Amazônia    1
             Caatinga    1
             Pantanal    1
Sentinel-2   Amazônia    1
             Cerrado     2
WorldView-3  Caatinga    1
             Pantanal    1
dtype: int64

Agrupar os dados por ‘Imagem’ e obter várias agregações para a coluna ‘Custo (R$)’ (média, soma e desvio padrão):

df.groupby('Imagem')['Custo'].agg(['mean', 'sum', 'std'])
mean sum std
Imagem
Landsat 8 9166.67 27500 5204.16
Sentinel-2 16666.67 50000 7637.63
WorldView-3 60000.00 120000 14142.14

Combinação de Dados

A combinação de dados é uma operação de grande relevância em geoprocessamento, permitindo que você junte informações de diferentes fontes ou DataFrames. Existem várias ferramentas para combinar DataFrames na Pandas, incluindo concatenação, junção e mesclagem.

  • Concatenação de DataFrames:

A concatenação é o processo de anexar um DataFrame a outro, seja verticalmente (adicionando linhas) ou horizontalmente (adicionando colunas).

Exemplo: Suponha que temos dois subconjuntos do nosso DataFrame df:

df1 = df.iloc[:2]
print(df1)
       Imagem    Regiao  Area_coberta  Custo
0   Landsat 8  Amazônia          1000   5000
1  Sentinel-2   Cerrado          1500  10000
df2 = df.iloc[2:4]
print(df2)
        Imagem    Regiao  Area_coberta  Custo
2    Landsat 8  Pantanal          2000  15000
3  WorldView-3  Pantanal           500  50000

Relembrando: Esse código utiliza o método iloc da Pandas, que é usado para selecionar linhas e colunas por suas posições numéricas (índices).

df1 = df.iloc[:2] seleciona as duas primeiras linhas do DataFrame df, atribuindo-as a um novo DataFrame chamado df1. O “:2” especifica que queremos todas as linhas do início até a posição 2 (exclusiva), ou seja, as linhas nas posições 0 e 1.

df2 = df.iloc[2:4] seleciona as linhas nas posições 2 e 3 do DataFrame df, atribuindo-as a um novo DataFrame chamado df2. O “2:4” especifica que queremos as linhas da posição 2 até a posição 4 (o registro que está na posição 4 não é selecionado).

Para concatená-los verticalmente:

df_concatenado = pd.concat([df1, df2])
df_concatenado
Imagem Regiao Area_coberta Custo
0 Landsat 8 Amazônia 1000 5000
1 Sentinel-2 Cerrado 1500 10000
2 Landsat 8 Pantanal 2000 15000
3 WorldView-3 Pantanal 500 50000

Para aplicar a concatenação horizontal, considere o conjunto de dados adicional:

dado_adicional = {
    'Qualidade': ['Alta', 'Média', 'Baixa', 'Alta', 
    'Alta', 'Média', 'Baixa', 'Alta']
}
df_adicional = pd.DataFrame(dado_adicional)
df_adicional
Qualidade
0 Alta
1 Média
2 Baixa
3 Alta
4 Alta
5 Média
6 Baixa
7 Alta

Para conectá-lo horizontalmente com o DataFrame ‘df’:

df_horizontal = pd.concat([df, df_adicional], axis=1)
df_horizontal
Imagem Regiao Area_coberta Custo Qualidade
0 Landsat 8 Amazônia 1000 5000 Alta
1 Sentinel-2 Cerrado 1500 10000 Média
2 Landsat 8 Pantanal 2000 15000 Baixa
3 WorldView-3 Pantanal 500 50000 Alta
4 Sentinel-2 Amazônia 3000 25000 Alta
5 WorldView-3 Caatinga 750 70000 Média
6 Landsat 8 Caatinga 1250 7500 Baixa
7 Sentinel-2 Cerrado 1750 15000 Alta

Neste exemplo, o argumento axis=1 indica que a concatenação deve ocorrer horizontalmente. O resultado é um DataFrame que combina as colunas de df e df_adicional:

Ao usar o método concat, é importante garantir que os índices dos DataFrames que estão sendo concatenados se alinhem corretamente, especialmente ao realizar a concatenação horizontal. Caso contrário, você pode acabar com valores ausentes nas posições onde os índices não se alinham.

  • junção e mesclagem

A junção e a mesclagem permitem combinar DataFrames com base em colunas comuns ou índices comuns. Vamos explorar como usar essas técnicas com os DataFrames df e df_satelites.

dados_satelites = {
    'Satelite': ['Landsat 8', 'Sentinel-2', 'WorldView-3'],
    'Resolucao_espacial': [30, 10, 0.31],  # Resolução do sensor óptico principal
    'Operador': ['NASA/USGS', 'ESA', 'DigitalGlobe']
}
df_satelites = pd.DataFrame(dados_satelites)
print(df_satelites)
      Satelite  Resolucao_espacial      Operador
0    Landsat 8               30.00     NASA/USGS
1   Sentinel-2               10.00           ESA
2  WorldView-3                0.31  DigitalGlobe

Merge

O método merge() é usado para combinar DataFrames com base em colunas comuns.

df_mesclado = df.merge(df_satelites, left_on='Imagem', right_on='Satelite', how='left')
df_mesclado
Imagem Regiao Area_coberta Custo Satelite Resolucao_espacial Operador
0 Landsat 8 Amazônia 1000 5000 Landsat 8 30.00 NASA/USGS
1 Sentinel-2 Cerrado 1500 10000 Sentinel-2 10.00 ESA
2 Landsat 8 Pantanal 2000 15000 Landsat 8 30.00 NASA/USGS
3 WorldView-3 Pantanal 500 50000 WorldView-3 0.31 DigitalGlobe
4 Sentinel-2 Amazônia 3000 25000 Sentinel-2 10.00 ESA
5 WorldView-3 Caatinga 750 70000 WorldView-3 0.31 DigitalGlobe
6 Landsat 8 Caatinga 1250 7500 Landsat 8 30.00 NASA/USGS
7 Sentinel-2 Cerrado 1750 15000 Sentinel-2 10.00 ESA

Neste exemplo, estamos usando left_on para especificar a coluna do DataFrame df e right_on para especificar a coluna do DataFrame df_satelites. O argumento how=’left’ garante que todas as entradas do df sejam mantidas, mesmo que não tenham uma correspondência no df_satelites.

Junção (join)

O método join é semelhante ao merge, mas é usado para combinar DataFrames com base em índices ao invés de colunas. Para demonstrá-lo, vamos primeiro definir o índice de df_satelites para a coluna ‘Satélite’:

df_satelites.set_index('Satelite', inplace=True)
df_satelites
Resolucao_espacial Operador
Satelite
Landsat 8 30.00 NASA/USGS
Sentinel-2 10.00 ESA
WorldView-3 0.31 DigitalGlobe

Agora, podemos usar join para combinar os DataFrames:

df_juncao = df.join(df_satelites, on='Imagem', how='left')
df_juncao
Imagem Regiao Area_coberta Custo Resolucao_espacial Operador
0 Landsat 8 Amazônia 1000 5000 30.00 NASA/USGS
1 Sentinel-2 Cerrado 1500 10000 10.00 ESA
2 Landsat 8 Pantanal 2000 15000 30.00 NASA/USGS
3 WorldView-3 Pantanal 500 50000 0.31 DigitalGlobe
4 Sentinel-2 Amazônia 3000 25000 10.00 ESA
5 WorldView-3 Caatinga 750 70000 0.31 DigitalGlobe
6 Landsat 8 Caatinga 1250 7500 30.00 NASA/USGS
7 Sentinel-2 Cerrado 1750 15000 10.00 ESA

Neste exemplo, estamos usando on para especificar a coluna do DataFrame df que deve ser usada para a junção. Novamente, how=’left’ garante que todas as entradas do df sejam mantidas.

3.3 Importação e exportação de dados#

A capacidade de importar e exportar dados é fundamental ao trabalhar com análise de dados no contexto do Geoprocessamento. A Pandas oferece uma ampla variedade de funções para ler e escrever dados em diversos formatos. Vamos explorar a importação e exportação de dados usando Pandas, com foco em arquivos CSV e Excel.

3.3.1 Arquivos CSV (Comma-Separated Values)#

A leitura de arquivos CSV (Comma-Separated Values) é uma das tarefas mais comuns ao se trabalhar com análise de dados em Python. Na Pandas utilizamos a função read_CSV. Vamos explorar os principais aspectos e opções dessa função: Sintaxe básica: df = pd.read_csv('caminho_do_arquivo.csv')

Caso o delimitador do arquivo seja ponto e vírgula, é possível utilizar o parâmetro “sep”:

df = pd.read_csv('caminho_do_arquivo.csv', sep=';')

Quadro 6: Parâmetros do método read_csv.

Parâmetro

Descrição

filepath_or_buffer

String contendo o caminho para o arquivo ou um objeto do tipo arquivo.

sep

Delimitador a ser usado. Padrão é ‘,’.

delimiter

Alternativa ao argumento sep.

header

Número(s) da(s) linha(s) a ser(em) usada(s) como nome das colunas. Padrão é ‘infer’ (inferir a partir da primeira linha).

names

Lista de nomes de colunas a serem usadas. Se o arquivo já tiver um cabeçalho, você deverá especificar header=0 para substituir.

index_col

Coluna(s) a ser(em) usada(s) como índice (linha).

usecols

Lista de colunas a serem lidas no DataFrame.

dtype

Tipo de dado para colunas. Pode ser um único tipo ou um dicionário.

skiprows

Número de linhas ou sequência de índices de linha para pular ao ler.

na_values

Sequência de valores que, se encontrados no CSV, devem ser tratados como NaN.

parse_dates

Colunas a serem interpretadas como datas.

date_parser

Função a ser usada para analisar datas.

nrows

Número de linhas a serem lidas a partir do início do arquivo.

skipfooter

Número de linhas a serem ignoradas na parte inferior do arquivo.

encoding

Codificação a ser usada para o arquivo. O padrão é ‘utf-8’, mas em alguns casos você pode precisar usar ‘ISO-8859-1’ ou outras.

compression

Tipo de compressão do arquivo. Suporta ‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, etc.

Exemplo 2: Ler somente determinadas colunas de um arquivo.

df = pd.read_csv('~/geopythonbook/files/f1/paises_america_sul.csv', usecols=['País', 'Área'])
df.head()
País Área
0 Argentina 2780400
1 Bolívia 1098581
2 Brasil 8515767
3 Chile 756102
4 Colômbia 1141748

Exemplo 3: Ler um arquivo e interpretar a coluna ‘data’ como data.

df = pd.read_csv('~/geopythonbook/files/f1/paises_america_sul.csv', parse_dates=['Independência'])
df.dtypes
País                     object
População                 int64
Área                      int64
Independência    datetime64[ns]
dtype: object

Exemplo 4: Tratar valores específicos como NaN.

Considere a tabela abaixo, que é proveniente de um arquivo CSV:

País

População

Brasil

211050000

Argentina

NA

Chile

19116201

Uruguai

N/A

Paraguai

7044636

Bolívia

-

Nesta tabela, temos diversos dados ausentes, representados por diferentes valores. Para que a Pandas os interprete como valores ausentes, podemos utilizar o método na_values() quando da leitura do arquivo CSV:

df = pd.read_csv('~/geopythonbook/files/f2/paises_dados_faltantes.csv', na_values=['NA', 'N/A', '-'])
print(df)
        Pais    Populacao
0     Brasil 211050000.00
1  Argentina          NaN
2      Chile  19116201.00
3    Uruguai          NaN
4   Paraguai   7044636.00
5    Bolívia          NaN

O parâmetro na_values é usado para especificar uma lista de valores que devem ser tratados como “faltantes” (ou “NA” - Not Available) ao ler o arquivo. No exemplo fornecido, qualquer ocorrência dos valores ‘NA’, ‘N/A’ ou ‘-‘ nas células do arquivo CSV será interpretada pela Pandas como um valor faltante (NaN).

No caso do DataFrame de nosso exemplo, para ler os dados da coluna ‘População’ como int ao invés de float, você pode usar o argumento dtype do método read_CSV(). No entanto, é importante lembrar que os valores NaN são representados como float em Pandas. Portanto, se você tentar ler a coluna diretamente como int, receberá um erro quando encontrar um NaN. Uma solução seria ler a coluna como float primeiro (devido aos NaNs) e depois converter os valores não-NaN para int.

3.3.2 Arquivos do Excel#

A leitura de arquivos Excel é outra tarefa muito frequente em Geoprocessamento. A Pandas oferece suporte para ler dados de planilhas do Excel, tanto no formato .xls (formato mais antigo) quanto no .xlsx (formato mais recente). A função principal para essa tarefa é a read_excel.

Quadro 7: Parâmetros do método read_excel.

Parâmetro

Descrição

io

Caminho do arquivo, URL ou objeto semelhante a um arquivo.

sheet_name

Nome ou índice da planilha a ser lida. Padrão é a primeira. Pode ser também uma lista de nomes/índices ou None para todas.

header

Número da linha a ser usada como cabeçalho. Padrão é 0 (a primeira linha).

names

Lista de nomes de colunas a serem usadas.

index_col

Coluna(s) a ser(em) usada(s) como índice (linha).

usecols

Lista de colunas a serem lidas no DataFrame ou string no formato do Excel (por exemplo, “A,E:G”).

dtype

Tipo de dado para colunas. Pode ser um único tipo ou um dicionário.

na_values

Sequência de valores que, se encontrados, devem ser tratados como NaN.

parse_dates

Colunas a serem interpretadas como datas.

date_parser

Função a ser usada para analisar datas.

nrows

Número de linhas a serem lidas a partir do início da planilha.

skipfooter

Número de linhas a serem ignoradas na parte inferior da planilha.

engine

Engine a ser usada para leitura. Pode ser ‘xlrd’, ‘openpyxl’ ou ‘odf’. Selecionada automaticamente pela Pandas.

Sintaxe básica:

df = pd.read_excel('caminho_do_arquivo.xlsx')

Exemplos: Considere um arquivo do Excel denominado paises_america_sul_central, com duas planilhas (figura 4): américa_central e américa_sul.

Figura 4

Figura 4: Planilhas do excel com dados de países das Américas do Sul e Central.

Para importar os dados somente da planilha america_central:

df = pd.read_excel('~/geopythonbook/files/f3/paises_america_sul_central.xlsx', 
    sheet_name='america_central')
print(df)
          País    Área  População
0       Belize   22966     294385
1   Costa Rica   51100    4133884
2  El Salvador   21041    6948073
3    Guatemala  108889   15472156
4     Honduras  112492    8098263
5    Nicarágua  130373    6082447
6       Panamá   75417    3694190

O método pd.read_excel() é utilizado para ler arquivos no formato Excel. O argumento adicional sheet_name=’america_central’ do método pd.read_excel() especifica qual planilha do arquivo Excel deve ser lida. Neste caso, estamos lendo a aba com o nome ‘america_central’.

Também é possível ler várias planilhas de um arquivo Excel com apenas um script:

dfs = pd.read_excel('~/geopythonbook/files/f3/paises_america_sul_central.xlsx', sheet_name=['america_sul', 'america_central'])
print(dfs)
{'america_sul':          País  População     Área
0   Argentina   45195777  2780400
1     Bolívia   11513100  1098581
2      Brasil  211050000  8515767
3       Chile   19116201   756102
4    Colômbia   50882891  1141748
5     Equador   17643054   283561
6      Guiana     786552   214969
7    Paraguai    7044636   406752
8        Peru   32971854  1285216
9    Suriname     586632   163821
10    Uruguai    3473727   176215
11  Venezuela   28435940   912050, 'america_central':           País    Área  População
0       Belize   22966     294385
1   Costa Rica   51100    4133884
2  El Salvador   21041    6948073
3    Guatemala  108889   15472156
4     Honduras  112492    8098263
5    Nicarágua  130373    6082447
6       Panamá   75417    3694190}

Nesse código:

sheet_name=['america_sul', 'america_central'] especifica duas abas por meio de uma lista. Isso indica ao método pd.read_excel() que desejamos ler os dados de ambas as abas ‘america_sul’ e ‘america_central’. Como resultado, a variável dfs será um dicionário onde as chaves são os nomes das abas (‘america_sul’ e ‘america_central’) e os valores são os respectivos DataFrames com os dados de cada aba.

3.3.3 Gravação de dados em diferentes formatos#

A Pandas oferece uma série de métodos que permitem gravar DataFrames em diversos formatos. Vamos ver como salvar seus dados em formato .CSV e .xlsx.

Arquivo CSV

Para gravar um DataFrame como um arquivo CSV, use o método to_CSV:

df.to_csv('caminho_para_salvar.csv', index=False, sep=',')

Parâmetros comuns:

  • index: Se verdadeiro, inclui o índice do DataFrame no arquivo. Por padrão é True;

  • sep: Delimitador a ser usado. Por padrão é ‘,’.

Arquivo Excel

Para gravar um DataFrame em um arquivo do Excel, use o método to_excel:

df.to_excel('caminho_para_salvar.xlsx', sheet_name='Planilha1', index=False)

Parâmetros comuns:

  • sheet_name: Nome da planilha onde os dados serão escritos. Por padrão é Sheet’;

  • index: Se verdadeiro, inclui o índice do DataFrame na planilha.