{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Manipulação de dados - III"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Agregação e agrupamento "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Agregando informações de linhas ou colunas\n",
"\n",
"Para agregar informações (p.ex. somar, tomar médias etc.) de linhas ou colunas podemos utilizar alguns métodos específicos já existentes em *DataFrames* e *Series*, tais como `sum`, `mean`, `cumsum` e `aggregate` (ou equivalentemente `agg`):"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"dados_covid_PB = pd.read_csv('https://superset.plataformatarget.com.br/superset/explore_json/?form_data=%7B%22slice_id%22%3A1550%7D&csv=true', \n",
" sep=',', index_col=0)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"casosNovos 440037\n",
"obitosNovos 9294\n",
"dtype: int64"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_covid_PB.agg(lambda vetor: np.sum(vetor))[['casosNovos','obitosNovos']].astype('int')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Podemos conferir esta agregação resultante com o número de casos acumulados e óbitos acumulados"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" casosAcumulados | \n",
" casosNovos | \n",
" descartados | \n",
" recuperados | \n",
" obitosAcumulados | \n",
" obitosNovos | \n",
" Letalidade | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-09-26 | \n",
" 441155 | \n",
" 134 | \n",
" 484336 | \n",
" 333751 | \n",
" 9294 | \n",
" 2.0 | \n",
" 0.0211 | \n",
"
\n",
" \n",
" 2021-09-25 | \n",
" 441021 | \n",
" 165 | \n",
" 484331 | \n",
" 333441 | \n",
" 9292 | \n",
" 2.0 | \n",
" 0.0211 | \n",
"
\n",
" \n",
" 2021-09-24 | \n",
" 440856 | \n",
" 225 | \n",
" 484301 | \n",
" 332845 | \n",
" 9290 | \n",
" 3.0 | \n",
" 0.0211 | \n",
"
\n",
" \n",
" 2021-09-23 | \n",
" 440631 | \n",
" 203 | \n",
" 484276 | \n",
" 332540 | \n",
" 9287 | \n",
" 3.0 | \n",
" 0.0211 | \n",
"
\n",
" \n",
" 2021-09-22 | \n",
" 440428 | \n",
" 297 | \n",
" 484265 | \n",
" 331958 | \n",
" 9284 | \n",
" 6.0 | \n",
" 0.0211 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" casosAcumulados casosNovos descartados recuperados \\\n",
"data \n",
"2021-09-26 441155 134 484336 333751 \n",
"2021-09-25 441021 165 484331 333441 \n",
"2021-09-24 440856 225 484301 332845 \n",
"2021-09-23 440631 203 484276 332540 \n",
"2021-09-22 440428 297 484265 331958 \n",
"\n",
" obitosAcumulados obitosNovos Letalidade \n",
"data \n",
"2021-09-26 9294 2.0 0.0211 \n",
"2021-09-25 9292 2.0 0.0211 \n",
"2021-09-24 9290 3.0 0.0211 \n",
"2021-09-23 9287 3.0 0.0211 \n",
"2021-09-22 9284 6.0 0.0211 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_covid_PB.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Isto também pode ser obtido utilizando o método `sum` de *DataFrames* e *Series*:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"casosNovos 440037.0\n",
"obitosNovos 9294.0\n",
"dtype: float64"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_covid_PB[['casosNovos','obitosNovos']].sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Podemos recriar a coluna `'obitosAcumulados'` com o método `cumsum` (soma cumulativa):"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"data\n",
"2020-03-16 0.0\n",
"2020-03-17 0.0\n",
"2020-03-18 0.0\n",
"2020-03-19 0.0\n",
"2020-03-20 0.0\n",
" ... \n",
"2021-09-22 9284.0\n",
"2021-09-23 9287.0\n",
"2021-09-24 9290.0\n",
"2021-09-25 9292.0\n",
"2021-09-26 9294.0\n",
"Name: obitosNovos, Length: 559, dtype: float64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_covid_PB.obitosNovos.sort_index().cumsum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Selecionando entradas distintas\n",
"\n",
"Para selecionar entradas distintas utilizamos o método `drop_duplicate`. Aqui, para exemplificar, vamos utilizar o banco de dados oficial sobre COVID no Brasil:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# pode levar um tempo para ler...\n",
"covid_BR = pd.read_excel('../database/HIST_PAINEL_COVIDBR_18jul2020.xlsx')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Unnamed: 0 | \n",
" regiao | \n",
" estado | \n",
" municipio | \n",
" coduf | \n",
" codmun | \n",
" codRegiaoSaude | \n",
" nomeRegiaoSaude | \n",
" data | \n",
" semanaEpi | \n",
" populacaoTCU2019 | \n",
" casosAcumulado | \n",
" casosNovos | \n",
" obitosAcumulado | \n",
" obitosNovos | \n",
" Recuperadosnovos | \n",
" emAcompanhamentoNovos | \n",
" interior/metropolitana | \n",
"
\n",
" \n",
" \n",
" \n",
" 629803 | \n",
" 629803 | \n",
" Centro-Oeste | \n",
" DF | \n",
" Brasília | \n",
" 53 | \n",
" 530010.0 | \n",
" 53001.0 | \n",
" DISTRITO FEDERAL | \n",
" 2020-07-16 | \n",
" 29 | \n",
" 3015268 | \n",
" 77621 | \n",
" 2242 | \n",
" 1037 | \n",
" 36 | \n",
" NaN | \n",
" NaN | \n",
" 1.0 | \n",
"
\n",
" \n",
" 629804 | \n",
" 629804 | \n",
" Centro-Oeste | \n",
" DF | \n",
" Brasília | \n",
" 53 | \n",
" 530010.0 | \n",
" 53001.0 | \n",
" DISTRITO FEDERAL | \n",
" 2020-07-17 | \n",
" 29 | \n",
" 3015268 | \n",
" 79400 | \n",
" 1779 | \n",
" 1060 | \n",
" 23 | \n",
" NaN | \n",
" NaN | \n",
" 1.0 | \n",
"
\n",
" \n",
" 629805 | \n",
" 629805 | \n",
" Centro-Oeste | \n",
" DF | \n",
" Brasília | \n",
" 53 | \n",
" 530010.0 | \n",
" 53001.0 | \n",
" DISTRITO FEDERAL | \n",
" 2020-07-18 | \n",
" 29 | \n",
" 3015268 | \n",
" 81163 | \n",
" 1763 | \n",
" 1075 | \n",
" 15 | \n",
" NaN | \n",
" NaN | \n",
" 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 regiao estado municipio coduf codmun \\\n",
"629803 629803 Centro-Oeste DF Brasília 53 530010.0 \n",
"629804 629804 Centro-Oeste DF Brasília 53 530010.0 \n",
"629805 629805 Centro-Oeste DF Brasília 53 530010.0 \n",
"\n",
" codRegiaoSaude nomeRegiaoSaude data semanaEpi \\\n",
"629803 53001.0 DISTRITO FEDERAL 2020-07-16 29 \n",
"629804 53001.0 DISTRITO FEDERAL 2020-07-17 29 \n",
"629805 53001.0 DISTRITO FEDERAL 2020-07-18 29 \n",
"\n",
" populacaoTCU2019 casosAcumulado casosNovos obitosAcumulado \\\n",
"629803 3015268 77621 2242 1037 \n",
"629804 3015268 79400 1779 1060 \n",
"629805 3015268 81163 1763 1075 \n",
"\n",
" obitosNovos Recuperadosnovos emAcompanhamentoNovos \\\n",
"629803 36 NaN NaN \n",
"629804 23 NaN NaN \n",
"629805 15 NaN NaN \n",
"\n",
" interior/metropolitana \n",
"629803 1.0 \n",
"629804 1.0 \n",
"629805 1.0 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_BR.tail(3)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 629806 entries, 0 to 629805\n",
"Data columns (total 18 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Unnamed: 0 629806 non-null int64 \n",
" 1 regiao 629806 non-null object \n",
" 2 estado 629661 non-null object \n",
" 3 municipio 623352 non-null object \n",
" 4 coduf 629806 non-null int64 \n",
" 5 codmun 625746 non-null float64\n",
" 6 codRegiaoSaude 623352 non-null float64\n",
" 7 nomeRegiaoSaude 623352 non-null object \n",
" 8 data 629806 non-null object \n",
" 9 semanaEpi 629806 non-null int64 \n",
" 10 populacaoTCU2019 627412 non-null object \n",
" 11 casosAcumulado 629806 non-null int64 \n",
" 12 casosNovos 629806 non-null int64 \n",
" 13 obitosAcumulado 629806 non-null int64 \n",
" 14 obitosNovos 629806 non-null int64 \n",
" 15 Recuperadosnovos 91 non-null float64\n",
" 16 emAcompanhamentoNovos 91 non-null float64\n",
" 17 interior/metropolitana 623352 non-null float64\n",
"dtypes: float64(5), int64(7), object(6)\n",
"memory usage: 86.5+ MB\n"
]
}
],
"source": [
"# resumo da tabela\n",
"covid_BR.info()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"[ nan, 'RO', 'AC', 'AM', 'RR', 'PA', 'AP', 'TO', 'MA', 'PI', 'CE', 'RN', 'PB',\n",
" 'PE', 'AL', 'SE', 'BA', 'MG', 'ES', 'RJ', 'SP', 'PR', 'SC', 'RS', 'MS', 'MT',\n",
" 'GO', 'DF']\n",
"Length: 28, dtype: object"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# todos os estados únicos\n",
"covid_BR.estado.drop_duplicates().array"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"['AC', 'AL', 'AM', 'AP', 'BA', 'CE', 'DF', 'ES', 'GO', 'MA', 'MG', 'MS', 'MT',\n",
" 'PA', 'PB', 'PE', 'PI', 'PR', 'RJ', 'RN', 'RO', 'RR', 'RS', 'SC', 'SE', 'SP',\n",
" 'TO']\n",
"Length: 27, dtype: object"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# ordena alfabeticamente\n",
"covid_BR.estado.drop_duplicates().dropna().sort_values().array"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Agrupando dados por valores em colunas e agregando os resultados\n",
"\n",
"Vamos determinar uma coluna para agrupar. Consideraremos o *DataFrame* `covid_BR`e selecionaremos os estados *PB*, *PE*, *RJ* e *SP* para realizar análises agrupando os resultados por estados."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Unnamed: 0 | \n",
" regiao | \n",
" estado | \n",
" municipio | \n",
" coduf | \n",
" codmun | \n",
" codRegiaoSaude | \n",
" nomeRegiaoSaude | \n",
" data | \n",
" semanaEpi | \n",
" populacaoTCU2019 | \n",
" casosAcumulado | \n",
" casosNovos | \n",
" obitosAcumulado | \n",
" obitosNovos | \n",
" Recuperadosnovos | \n",
" emAcompanhamentoNovos | \n",
" interior/metropolitana | \n",
"
\n",
" \n",
" \n",
" \n",
" 1740 | \n",
" 1740 | \n",
" Nordeste | \n",
" PB | \n",
" NaN | \n",
" 25 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 2020-02-25 | \n",
" 9 | \n",
" 4018127 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1741 | \n",
" 1741 | \n",
" Nordeste | \n",
" PB | \n",
" NaN | \n",
" 25 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 2020-02-26 | \n",
" 9 | \n",
" 4018127 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1742 | \n",
" 1742 | \n",
" Nordeste | \n",
" PB | \n",
" NaN | \n",
" 25 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 2020-02-27 | \n",
" 9 | \n",
" 4018127 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1743 | \n",
" 1743 | \n",
" Nordeste | \n",
" PB | \n",
" NaN | \n",
" 25 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 2020-02-28 | \n",
" 9 | \n",
" 4018127 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 1744 | \n",
" 1744 | \n",
" Nordeste | \n",
" PB | \n",
" NaN | \n",
" 25 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 2020-02-29 | \n",
" 9 | \n",
" 4018127 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 448655 | \n",
" 448655 | \n",
" Sudeste | \n",
" SP | \n",
" Estiva Gerbi | \n",
" 35 | \n",
" 355730.0 | \n",
" 35141.0 | \n",
" BAIXA MOGIANA | \n",
" 2020-07-14 | \n",
" 29 | \n",
" 11304 | \n",
" 62 | \n",
" 6 | \n",
" 3 | \n",
" 1 | \n",
" NaN | \n",
" NaN | \n",
" 0.0 | \n",
"
\n",
" \n",
" 448656 | \n",
" 448656 | \n",
" Sudeste | \n",
" SP | \n",
" Estiva Gerbi | \n",
" 35 | \n",
" 355730.0 | \n",
" 35141.0 | \n",
" BAIXA MOGIANA | \n",
" 2020-07-15 | \n",
" 29 | \n",
" 11304 | \n",
" 65 | \n",
" 3 | \n",
" 3 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" 0.0 | \n",
"
\n",
" \n",
" 448657 | \n",
" 448657 | \n",
" Sudeste | \n",
" SP | \n",
" Estiva Gerbi | \n",
" 35 | \n",
" 355730.0 | \n",
" 35141.0 | \n",
" BAIXA MOGIANA | \n",
" 2020-07-16 | \n",
" 29 | \n",
" 11304 | \n",
" 70 | \n",
" 5 | \n",
" 3 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" 0.0 | \n",
"
\n",
" \n",
" 448658 | \n",
" 448658 | \n",
" Sudeste | \n",
" SP | \n",
" Estiva Gerbi | \n",
" 35 | \n",
" 355730.0 | \n",
" 35141.0 | \n",
" BAIXA MOGIANA | \n",
" 2020-07-17 | \n",
" 29 | \n",
" 11304 | \n",
" 75 | \n",
" 5 | \n",
" 4 | \n",
" 1 | \n",
" NaN | \n",
" NaN | \n",
" 0.0 | \n",
"
\n",
" \n",
" 448659 | \n",
" 448659 | \n",
" Sudeste | \n",
" SP | \n",
" Estiva Gerbi | \n",
" 35 | \n",
" 355730.0 | \n",
" 35141.0 | \n",
" BAIXA MOGIANA | \n",
" 2020-07-18 | \n",
" 29 | \n",
" 11304 | \n",
" 75 | \n",
" 0 | \n",
" 4 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
130768 rows × 18 columns
\n",
"
"
],
"text/plain": [
" Unnamed: 0 regiao estado municipio coduf codmun \\\n",
"1740 1740 Nordeste PB NaN 25 NaN \n",
"1741 1741 Nordeste PB NaN 25 NaN \n",
"1742 1742 Nordeste PB NaN 25 NaN \n",
"1743 1743 Nordeste PB NaN 25 NaN \n",
"1744 1744 Nordeste PB NaN 25 NaN \n",
"... ... ... ... ... ... ... \n",
"448655 448655 Sudeste SP Estiva Gerbi 35 355730.0 \n",
"448656 448656 Sudeste SP Estiva Gerbi 35 355730.0 \n",
"448657 448657 Sudeste SP Estiva Gerbi 35 355730.0 \n",
"448658 448658 Sudeste SP Estiva Gerbi 35 355730.0 \n",
"448659 448659 Sudeste SP Estiva Gerbi 35 355730.0 \n",
"\n",
" codRegiaoSaude nomeRegiaoSaude data semanaEpi \\\n",
"1740 NaN NaN 2020-02-25 9 \n",
"1741 NaN NaN 2020-02-26 9 \n",
"1742 NaN NaN 2020-02-27 9 \n",
"1743 NaN NaN 2020-02-28 9 \n",
"1744 NaN NaN 2020-02-29 9 \n",
"... ... ... ... ... \n",
"448655 35141.0 BAIXA MOGIANA 2020-07-14 29 \n",
"448656 35141.0 BAIXA MOGIANA 2020-07-15 29 \n",
"448657 35141.0 BAIXA MOGIANA 2020-07-16 29 \n",
"448658 35141.0 BAIXA MOGIANA 2020-07-17 29 \n",
"448659 35141.0 BAIXA MOGIANA 2020-07-18 29 \n",
"\n",
" populacaoTCU2019 casosAcumulado casosNovos obitosAcumulado \\\n",
"1740 4018127 0 0 0 \n",
"1741 4018127 0 0 0 \n",
"1742 4018127 0 0 0 \n",
"1743 4018127 0 0 0 \n",
"1744 4018127 0 0 0 \n",
"... ... ... ... ... \n",
"448655 11304 62 6 3 \n",
"448656 11304 65 3 3 \n",
"448657 11304 70 5 3 \n",
"448658 11304 75 5 4 \n",
"448659 11304 75 0 4 \n",
"\n",
" obitosNovos Recuperadosnovos emAcompanhamentoNovos \\\n",
"1740 0 NaN NaN \n",
"1741 0 NaN NaN \n",
"1742 0 NaN NaN \n",
"1743 0 NaN NaN \n",
"1744 0 NaN NaN \n",
"... ... ... ... \n",
"448655 1 NaN NaN \n",
"448656 0 NaN NaN \n",
"448657 0 NaN NaN \n",
"448658 1 NaN NaN \n",
"448659 0 NaN NaN \n",
"\n",
" interior/metropolitana \n",
"1740 NaN \n",
"1741 NaN \n",
"1742 NaN \n",
"1743 NaN \n",
"1744 NaN \n",
"... ... \n",
"448655 0.0 \n",
"448656 0.0 \n",
"448657 0.0 \n",
"448658 0.0 \n",
"448659 0.0 \n",
"\n",
"[130768 rows x 18 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_BR.query('estado in [\"PB\", \"PE\", \"RJ\", \"SP\"]')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Inspecionando o conjunto de dados, observamos que os dados para estado são apresentados com o valor `NaN` para `codmun` e quando `codmun` possui um valor diferente de `NaN`, o resultado é apenas para o município do código em questão.\n",
"\n",
"Como estamos interessados nos valores por estado, vamos selecionar apenas os dados com `codmun` contendo `NaN`."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"covid_estados = covid_BR.query('estado in [\"PB\", \"PE\", \"RJ\", \"SP\"]')\n",
"covid_apenas_estados = covid_estados.loc[covid_estados['codmun'].isna()]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos agora selecionar apenas as colunas de interesse. Para tanto, vejamos os nomes das colunas:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Unnamed: 0', 'regiao', 'estado', 'municipio', 'coduf', 'codmun',\n",
" 'codRegiaoSaude', 'nomeRegiaoSaude', 'data', 'semanaEpi',\n",
" 'populacaoTCU2019', 'casosAcumulado', 'casosNovos', 'obitosAcumulado',\n",
" 'obitosNovos', 'Recuperadosnovos', 'emAcompanhamentoNovos',\n",
" 'interior/metropolitana'],\n",
" dtype='object')"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_apenas_estados.columns"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"covid_apenas_estados = covid_apenas_estados[['estado', 'data', 'casosNovos', 'obitosNovos']]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"A data parece ser o *index* natural, já que o *index* atual não representa nada. Observe que teremos *index* repetidos, pois teremos as mesmas datas em estados diferentes."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" estado | \n",
" data | \n",
" casosNovos | \n",
" obitosNovos | \n",
"
\n",
" \n",
" \n",
" \n",
" 1740 | \n",
" PB | \n",
" 2020-02-25 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1741 | \n",
" PB | \n",
" 2020-02-26 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1742 | \n",
" PB | \n",
" 2020-02-27 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1743 | \n",
" PB | \n",
" 2020-02-28 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1744 | \n",
" PB | \n",
" 2020-02-29 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 3040 | \n",
" SP | \n",
" 2020-07-14 | \n",
" 12000 | \n",
" 417 | \n",
"
\n",
" \n",
" 3041 | \n",
" SP | \n",
" 2020-07-15 | \n",
" 6569 | \n",
" 316 | \n",
"
\n",
" \n",
" 3042 | \n",
" SP | \n",
" 2020-07-16 | \n",
" 8872 | \n",
" 398 | \n",
"
\n",
" \n",
" 3043 | \n",
" SP | \n",
" 2020-07-17 | \n",
" 5367 | \n",
" 339 | \n",
"
\n",
" \n",
" 3044 | \n",
" SP | \n",
" 2020-07-18 | \n",
" 4612 | \n",
" 270 | \n",
"
\n",
" \n",
"
\n",
"
580 rows × 4 columns
\n",
"
"
],
"text/plain": [
" estado data casosNovos obitosNovos\n",
"1740 PB 2020-02-25 0 0\n",
"1741 PB 2020-02-26 0 0\n",
"1742 PB 2020-02-27 0 0\n",
"1743 PB 2020-02-28 0 0\n",
"1744 PB 2020-02-29 0 0\n",
"... ... ... ... ...\n",
"3040 SP 2020-07-14 12000 417\n",
"3041 SP 2020-07-15 6569 316\n",
"3042 SP 2020-07-16 8872 398\n",
"3043 SP 2020-07-17 5367 339\n",
"3044 SP 2020-07-18 4612 270\n",
"\n",
"[580 rows x 4 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_apenas_estados"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
"covid_apenas_estados = covid_apenas_estados.set_index('data')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" estado | \n",
" casosNovos | \n",
" obitosNovos | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2020-02-25 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-26 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-27 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-28 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-29 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 2020-07-14 | \n",
" SP | \n",
" 12000 | \n",
" 417 | \n",
"
\n",
" \n",
" 2020-07-15 | \n",
" SP | \n",
" 6569 | \n",
" 316 | \n",
"
\n",
" \n",
" 2020-07-16 | \n",
" SP | \n",
" 8872 | \n",
" 398 | \n",
"
\n",
" \n",
" 2020-07-17 | \n",
" SP | \n",
" 5367 | \n",
" 339 | \n",
"
\n",
" \n",
" 2020-07-18 | \n",
" SP | \n",
" 4612 | \n",
" 270 | \n",
"
\n",
" \n",
"
\n",
"
580 rows × 3 columns
\n",
"
"
],
"text/plain": [
" estado casosNovos obitosNovos\n",
"data \n",
"2020-02-25 PB 0 0\n",
"2020-02-26 PB 0 0\n",
"2020-02-27 PB 0 0\n",
"2020-02-28 PB 0 0\n",
"2020-02-29 PB 0 0\n",
"... ... ... ...\n",
"2020-07-14 SP 12000 417\n",
"2020-07-15 SP 6569 316\n",
"2020-07-16 SP 8872 398\n",
"2020-07-17 SP 5367 339\n",
"2020-07-18 SP 4612 270\n",
"\n",
"[580 rows x 3 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_apenas_estados"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Agrupando com o método *groupby*\n",
"\n",
"Podemos escolher uma (ou mais colunas, incluindo o índice) para agrupar os dados. Ao agruparmos os dados, receberemos um objeto do tipo `DataFrameGroupBy`. Para vermos os resultados, devemos agregar os valores:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"covid_estados_agrupado = covid_apenas_estados.groupby('estado')"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Casos Totais | \n",
" Obitos Totais | \n",
"
\n",
" \n",
" estado | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" PB | \n",
" 66971 | \n",
" 1477 | \n",
"
\n",
" \n",
" PE | \n",
" 78509 | \n",
" 5928 | \n",
"
\n",
" \n",
" RJ | \n",
" 135230 | \n",
" 11919 | \n",
"
\n",
" \n",
" SP | \n",
" 412027 | \n",
" 19647 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Casos Totais Obitos Totais\n",
"estado \n",
"PB 66971 1477\n",
"PE 78509 5928\n",
"RJ 135230 11919\n",
"SP 412027 19647"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_estados_agrupado.sum().rename({'casosNovos':'Casos Totais', 'obitosNovos':'Obitos Totais'},axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Podemos agrupar por mais de uma coluna. Vamos fazer dois grupos. *grupo_1* formado por PB e PE e *grupo_2* formado por RJ e SP. Em seguida, vamos agrupar por grupo e por data:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"covid_estados_grupos = covid_apenas_estados.copy()\n",
"col_grupos = covid_estados_grupos.estado.map(lambda estado: 'grupo_1' if estado in ['PB','PE']\n",
" else 'grupo_2')\n",
"covid_estados_grupos['grupo'] = col_grupos"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" estado | \n",
" casosNovos | \n",
" obitosNovos | \n",
" grupo | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2020-02-25 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
" grupo_1 | \n",
"
\n",
" \n",
" 2020-02-26 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
" grupo_1 | \n",
"
\n",
" \n",
" 2020-02-27 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
" grupo_1 | \n",
"
\n",
" \n",
" 2020-02-28 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
" grupo_1 | \n",
"
\n",
" \n",
" 2020-02-29 | \n",
" PB | \n",
" 0 | \n",
" 0 | \n",
" grupo_1 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 2020-07-14 | \n",
" SP | \n",
" 12000 | \n",
" 417 | \n",
" grupo_2 | \n",
"
\n",
" \n",
" 2020-07-15 | \n",
" SP | \n",
" 6569 | \n",
" 316 | \n",
" grupo_2 | \n",
"
\n",
" \n",
" 2020-07-16 | \n",
" SP | \n",
" 8872 | \n",
" 398 | \n",
" grupo_2 | \n",
"
\n",
" \n",
" 2020-07-17 | \n",
" SP | \n",
" 5367 | \n",
" 339 | \n",
" grupo_2 | \n",
"
\n",
" \n",
" 2020-07-18 | \n",
" SP | \n",
" 4612 | \n",
" 270 | \n",
" grupo_2 | \n",
"
\n",
" \n",
"
\n",
"
580 rows × 4 columns
\n",
"
"
],
"text/plain": [
" estado casosNovos obitosNovos grupo\n",
"data \n",
"2020-02-25 PB 0 0 grupo_1\n",
"2020-02-26 PB 0 0 grupo_1\n",
"2020-02-27 PB 0 0 grupo_1\n",
"2020-02-28 PB 0 0 grupo_1\n",
"2020-02-29 PB 0 0 grupo_1\n",
"... ... ... ... ...\n",
"2020-07-14 SP 12000 417 grupo_2\n",
"2020-07-15 SP 6569 316 grupo_2\n",
"2020-07-16 SP 8872 398 grupo_2\n",
"2020-07-17 SP 5367 339 grupo_2\n",
"2020-07-18 SP 4612 270 grupo_2\n",
"\n",
"[580 rows x 4 columns]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_estados_grupos"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Agora vamos agrupar e agregar:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"covid_grupo_agrupado = covid_estados_grupos.groupby(['grupo','data'])"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" casosNovos | \n",
" obitosNovos | \n",
"
\n",
" \n",
" grupo | \n",
" data | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" grupo_1 | \n",
" 2020-02-25 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-26 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-27 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-28 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-29 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" grupo_2 | \n",
" 2020-07-14 | \n",
" 12778 | \n",
" 567 | \n",
"
\n",
" \n",
" 2020-07-15 | \n",
" 8196 | \n",
" 449 | \n",
"
\n",
" \n",
" 2020-07-16 | \n",
" 8996 | \n",
" 490 | \n",
"
\n",
" \n",
" 2020-07-17 | \n",
" 6024 | \n",
" 409 | \n",
"
\n",
" \n",
" 2020-07-18 | \n",
" 4612 | \n",
" 270 | \n",
"
\n",
" \n",
"
\n",
"
290 rows × 2 columns
\n",
"
"
],
"text/plain": [
" casosNovos obitosNovos\n",
"grupo data \n",
"grupo_1 2020-02-25 0 0\n",
" 2020-02-26 0 0\n",
" 2020-02-27 0 0\n",
" 2020-02-28 0 0\n",
" 2020-02-29 0 0\n",
"... ... ...\n",
"grupo_2 2020-07-14 12778 567\n",
" 2020-07-15 8196 449\n",
" 2020-07-16 8996 490\n",
" 2020-07-17 6024 409\n",
" 2020-07-18 4612 270\n",
"\n",
"[290 rows x 2 columns]"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_grupo_agrupado.sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Mesclando *DataFrames* \n",
"\n",
"Vamos agora ver algumas formas de juntar dois ou mais *DataFrames* com *index* ou colunas em comum para formar um novo *DataFrame*.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"#### Mesclando *DataFrames* através de concatenações\n",
"\n",
"Concatenar nada mais é do que \"colar\" dois ou mais *DataFrames*. Podemos concatenar por linhas ou por colunas.\n",
"\n",
"A função que realiza a concatenação é `concat`. Os dois argumentos mais utilizados são a lista de *DataFrames* a serem concatenados e `axis`, onde `axis = 0` indica concatenação por linha (um *DataFrame* \"embaixo\" do outro) e `axis=1` indica concatenação por coluna (um *DataFrame* ao lado do outro)."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Relembre do *DataFrame* `df_dict_series`:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"df_dict_series = pd.read_csv('../database/df_dict_series.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos criar um novo, com novas pessoas:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"serie_Idade_nova = pd.Series({'Augusto':13, 'André': 17, 'Alexandre': 45}, name=\"Idade\")\n",
"serie_Peso_novo = pd.Series({'Augusto':95, 'André': 65, 'Alexandre': 83}, name=\"Peso\")\n",
"serie_Altura_nova = pd.Series({'Augusto':192, 'André': 175, 'Alexandre': 177}, name=\"Altura\")\n",
"serie_sobrenome = pd.Series({'Augusto':'Castro', 'André':'Castro', 'Alexandre':'Castro'}, name='Sobrenome')\n",
"dicionario_novo = {'Sobrenome':serie_sobrenome, 'Peso': serie_Peso_novo, \n",
" 'Idade': serie_Idade_nova, 'Altura': serie_Altura_nova}\n",
"df_novo = pd.DataFrame(dicionario_novo)\n",
"df_novo = df_novo.assign(IMC=round(df_novo.eval('Peso/(Altura/100)**2'),2))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Sobrenome | \n",
" Peso | \n",
" Idade | \n",
" Altura | \n",
" IMC | \n",
"
\n",
" \n",
" \n",
" \n",
" Augusto | \n",
" Castro | \n",
" 95 | \n",
" 13 | \n",
" 192 | \n",
" 25.77 | \n",
"
\n",
" \n",
" André | \n",
" Castro | \n",
" 65 | \n",
" 17 | \n",
" 175 | \n",
" 21.22 | \n",
"
\n",
" \n",
" Alexandre | \n",
" Castro | \n",
" 83 | \n",
" 45 | \n",
" 177 | \n",
" 26.49 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Sobrenome Peso Idade Altura IMC\n",
"Augusto Castro 95 13 192 25.77\n",
"André Castro 65 17 175 21.22\n",
"Alexandre Castro 83 45 177 26.49"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_novo"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Agora vamos concatená-los:"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Unnamed: 0 | \n",
" Idade | \n",
" Peso | \n",
" Altura | \n",
" IMC | \n",
" Sobrenome | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Ana | \n",
" 20 | \n",
" 65 | \n",
" 162 | \n",
" 24.77 | \n",
" Silva | \n",
"
\n",
" \n",
" 1 | \n",
" João | \n",
" 19 | \n",
" 80 | \n",
" 178 | \n",
" 25.25 | \n",
" PraDo | \n",
"
\n",
" \n",
" 2 | \n",
" Maria | \n",
" 21 | \n",
" 62 | \n",
" 162 | \n",
" 23.62 | \n",
" Sales | \n",
"
\n",
" \n",
" 3 | \n",
" Pedro | \n",
" 22 | \n",
" 67 | \n",
" 165 | \n",
" 24.61 | \n",
" MachadO | \n",
"
\n",
" \n",
" 4 | \n",
" Túlio | \n",
" 20 | \n",
" 73 | \n",
" 171 | \n",
" 24.96 | \n",
" Coutinho | \n",
"
\n",
" \n",
" Augusto | \n",
" NaN | \n",
" 13 | \n",
" 95 | \n",
" 192 | \n",
" 25.77 | \n",
" Castro | \n",
"
\n",
" \n",
" André | \n",
" NaN | \n",
" 17 | \n",
" 65 | \n",
" 175 | \n",
" 21.22 | \n",
" Castro | \n",
"
\n",
" \n",
" Alexandre | \n",
" NaN | \n",
" 45 | \n",
" 83 | \n",
" 177 | \n",
" 26.49 | \n",
" Castro | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 Idade Peso Altura IMC Sobrenome\n",
"0 Ana 20 65 162 24.77 Silva\n",
"1 João 19 80 178 25.25 PraDo\n",
"2 Maria 21 62 162 23.62 Sales\n",
"3 Pedro 22 67 165 24.61 MachadO\n",
"4 Túlio 20 73 171 24.96 Coutinho\n",
"Augusto NaN 13 95 192 25.77 Castro\n",
"André NaN 17 65 175 21.22 Castro\n",
"Alexandre NaN 45 83 177 26.49 Castro"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.concat([df_dict_series,df_novo]) "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Concatenando por coluna\n",
"\n",
"Para exemplificar vamos considerar os dados de COVID da Paraíba, selecionando casos novos e óbitos novos, e vamos obter dos dados do Brasil apenas os casos e óbitos diários do país, e vamos concatená-los por coluna."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"covid_PB_casos_obitos = dados_covid_PB[['casosNovos','obitosNovos']]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos tratar os dados do Brasil:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"covid_BR_casos_obitos = covid_BR.query('regiao==\"Brasil\"')\n",
"covid_BR_casos_obitos = covid_BR_casos_obitos.set_index('data')\n",
"covid_BR_casos_obitos = covid_BR_casos_obitos[['casosNovos','obitosNovos']].rename({\n",
" 'casosNovos':'casosBR', 'obitosNovos':'obitosBR'\n",
"}, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" casosNovos | \n",
" obitosNovos | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-09-26 | \n",
" 134 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 2021-09-25 | \n",
" 165 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 2021-09-24 | \n",
" 225 | \n",
" 3.0 | \n",
"
\n",
" \n",
" 2021-09-23 | \n",
" 203 | \n",
" 3.0 | \n",
"
\n",
" \n",
" 2021-09-22 | \n",
" 297 | \n",
" 6.0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 2020-03-20 | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-19 | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-18 | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-17 | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-16 | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
559 rows × 2 columns
\n",
"
"
],
"text/plain": [
" casosNovos obitosNovos\n",
"data \n",
"2021-09-26 134 2.0\n",
"2021-09-25 165 2.0\n",
"2021-09-24 225 3.0\n",
"2021-09-23 203 3.0\n",
"2021-09-22 297 6.0\n",
"... ... ...\n",
"2020-03-20 0 0.0\n",
"2020-03-19 0 0.0\n",
"2020-03-18 0 0.0\n",
"2020-03-17 0 0.0\n",
"2020-03-16 0 0.0\n",
"\n",
"[559 rows x 2 columns]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_PB_casos_obitos"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" casosBR | \n",
" obitosBR | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2020-02-25 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-26 | \n",
" 1 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-27 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-28 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2020-02-29 | \n",
" 1 | \n",
" 0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 2020-07-14 | \n",
" 41857 | \n",
" 1300 | \n",
"
\n",
" \n",
" 2020-07-15 | \n",
" 39924 | \n",
" 1233 | \n",
"
\n",
" \n",
" 2020-07-16 | \n",
" 45403 | \n",
" 1322 | \n",
"
\n",
" \n",
" 2020-07-17 | \n",
" 34177 | \n",
" 1163 | \n",
"
\n",
" \n",
" 2020-07-18 | \n",
" 28532 | \n",
" 921 | \n",
"
\n",
" \n",
"
\n",
"
145 rows × 2 columns
\n",
"
"
],
"text/plain": [
" casosBR obitosBR\n",
"data \n",
"2020-02-25 0 0\n",
"2020-02-26 1 0\n",
"2020-02-27 0 0\n",
"2020-02-28 0 0\n",
"2020-02-29 1 0\n",
"... ... ...\n",
"2020-07-14 41857 1300\n",
"2020-07-15 39924 1233\n",
"2020-07-16 45403 1322\n",
"2020-07-17 34177 1163\n",
"2020-07-18 28532 921\n",
"\n",
"[145 rows x 2 columns]"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"covid_BR_casos_obitos"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos agora concatená-los por coluna:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" casosNovos | \n",
" obitosNovos | \n",
" casosBR | \n",
" obitosBR | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-09-26 | \n",
" 134.0 | \n",
" 2.0 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-25 | \n",
" 165.0 | \n",
" 2.0 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-24 | \n",
" 225.0 | \n",
" 3.0 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-23 | \n",
" 203.0 | \n",
" 3.0 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-22 | \n",
" 297.0 | \n",
" 6.0 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 2020-03-11 | \n",
" NaN | \n",
" NaN | \n",
" 18.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-12 | \n",
" NaN | \n",
" NaN | \n",
" 25.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-13 | \n",
" NaN | \n",
" NaN | \n",
" 21.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-14 | \n",
" NaN | \n",
" NaN | \n",
" 23.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-15 | \n",
" NaN | \n",
" NaN | \n",
" 79.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
579 rows × 4 columns
\n",
"
"
],
"text/plain": [
" casosNovos obitosNovos casosBR obitosBR\n",
"data \n",
"2021-09-26 134.0 2.0 NaN NaN\n",
"2021-09-25 165.0 2.0 NaN NaN\n",
"2021-09-24 225.0 3.0 NaN NaN\n",
"2021-09-23 203.0 3.0 NaN NaN\n",
"2021-09-22 297.0 6.0 NaN NaN\n",
"... ... ... ... ...\n",
"2020-03-11 NaN NaN 18.0 0.0\n",
"2020-03-12 NaN NaN 25.0 0.0\n",
"2020-03-13 NaN NaN 21.0 0.0\n",
"2020-03-14 NaN NaN 23.0 0.0\n",
"2020-03-15 NaN NaN 79.0 0.0\n",
"\n",
"[579 rows x 4 columns]"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.concat([covid_PB_casos_obitos, covid_BR_casos_obitos], axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Para um polimento final, vamos substituir os valores `NaN` que ocorreram antes do dia 13 de julho por 0. Para tanto, a forma ideal é utilizando o método `map`:"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" casosNovos | \n",
" obitosNovos | \n",
" casosBR | \n",
" obitosBR | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-09-26 | \n",
" 134 | \n",
" 2 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-25 | \n",
" 165 | \n",
" 2 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-24 | \n",
" 225 | \n",
" 3 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-23 | \n",
" 203 | \n",
" 3 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-09-22 | \n",
" 297 | \n",
" 6 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 2020-03-11 | \n",
" 0 | \n",
" 0 | \n",
" 18.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-12 | \n",
" 0 | \n",
" 0 | \n",
" 25.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-13 | \n",
" 0 | \n",
" 0 | \n",
" 21.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-14 | \n",
" 0 | \n",
" 0 | \n",
" 23.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-15 | \n",
" 0 | \n",
" 0 | \n",
" 79.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
579 rows × 4 columns
\n",
"
"
],
"text/plain": [
" casosNovos obitosNovos casosBR obitosBR\n",
"data \n",
"2021-09-26 134 2 NaN NaN\n",
"2021-09-25 165 2 NaN NaN\n",
"2021-09-24 225 3 NaN NaN\n",
"2021-09-23 203 3 NaN NaN\n",
"2021-09-22 297 6 NaN NaN\n",
"... ... ... ... ...\n",
"2020-03-11 0 0 18.0 0.0\n",
"2020-03-12 0 0 25.0 0.0\n",
"2020-03-13 0 0 21.0 0.0\n",
"2020-03-14 0 0 23.0 0.0\n",
"2020-03-15 0 0 79.0 0.0\n",
"\n",
"[579 rows x 4 columns]"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_PB_BR = pd.concat([covid_PB_casos_obitos, covid_BR_casos_obitos], axis=1)\n",
"dados_PB_BR['casosNovos'] = dados_PB_BR.casosNovos.map(lambda caso: 0 if np.isnan(caso) else caso).astype('int')\n",
"dados_PB_BR['obitosNovos'] = dados_PB_BR.obitosNovos.map(lambda obito: 0 if np.isnan(obito) else obito).astype('int')\n",
"dados_PB_BR"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Mesclando *DataFrames* através de *joins*\n",
"\n",
"Para realizar *joins* iremos utilizar a função `merge` do *pandas*. *joins* tomam duas tabelas, uma tabela à esquerda e uma à direita e retornam uma terceira tabela contendo a união das colunas das duas tabelas."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Existem 4 tipos de *joins*:\n",
"\n",
"* *left join*: Apenas irão aparecer os *index* (da linha) que existem na tabela à esquerda;\n",
"* *right join*: Apenas irão aparecer os *index* (da linha) que existem na tabela à direita;\n",
"* *inner join*: Apenas irão aparecer os *index* que existem nas duas tabelas;\n",
"* *full join* ou *outer join*: irão aparecer todos os *index* das duas tabelas."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Para exemplificar vamos considerar dois *DataFrames* (aqui teremos menos linhas, com nomes e dados fictícios). O primeiro *DataFrame* consistirá de nomes de alunos, CPF e matrícula da UFPB (*nome_cpf_mat*). O segundo *DataFrame* consistirá de nome, CPF e e-mail (*nome_cpf_email*). Nosso objetivo é criar um novo *DataFrame* contendo Nome, CPF, matrícula e e-mail."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Temos ainda as seguintes situações:\n",
"\n",
"- No *DataFrame* *nome_cpf_mat* existem alunos que não estão presentes no *nome_cpf_email*, pois não enviaram esta informação.\n",
"\n",
"- No *DataFrame* *nome_cpf_email* existem alunos que não estão presentes no *nome_cpf_mat* pois estes não são alunos da UFPB."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"nome_cpf_mat = pd.read_csv('../database/nome_cpf_mat.csv')\n",
"nome_cpf_email = pd.read_csv('../database/nome_cpf_email.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos agora examinar os *DataFrames*. Como são bem simples, basta realizar *prints* deles."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Nome | \n",
" CPF | \n",
" Matricula | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" João Paulo | \n",
" 326.475.190-99 | \n",
" 8848484 | \n",
"
\n",
" \n",
" 1 | \n",
" Ana Silva | \n",
" 073.101.240-22 | \n",
" 8451212 | \n",
"
\n",
" \n",
" 2 | \n",
" Antonio Carlos | \n",
" 830.060.930-03 | \n",
" 5151213 | \n",
"
\n",
" \n",
" 3 | \n",
" Debora Santos | \n",
" 472.006.460-40 | \n",
" 51848484 | \n",
"
\n",
" \n",
" 4 | \n",
" Rodrigo Gomes | \n",
" 566.712.550-16 | \n",
" 1415816 | \n",
"
\n",
" \n",
" 5 | \n",
" Edson Jardim | \n",
" 308.226.400-07 | \n",
" 9592303 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Nome CPF Matricula\n",
"0 João Paulo 326.475.190-99 8848484\n",
"1 Ana Silva 073.101.240-22 8451212\n",
"2 Antonio Carlos 830.060.930-03 5151213\n",
"3 Debora Santos 472.006.460-40 51848484\n",
"4 Rodrigo Gomes 566.712.550-16 1415816\n",
"5 Edson Jardim 308.226.400-07 9592303"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nome_cpf_mat"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Nome | \n",
" CPF | \n",
" e-mail | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" João Paulo | \n",
" 326.475.190-99 | \n",
" joao@inventado.com.br | \n",
"
\n",
" \n",
" 1 | \n",
" Ana Silva | \n",
" 073.101.240-22 | \n",
" ana@inventado.com.br | \n",
"
\n",
" \n",
" 2 | \n",
" Antonio Carlos | \n",
" 830.060.930-03 | \n",
" antonio@inventado.com.br | \n",
"
\n",
" \n",
" 3 | \n",
" Saulo Santos | \n",
" 370.981.810-99 | \n",
" saulo@inventado.com.br | \n",
"
\n",
" \n",
" 4 | \n",
" Paulo Cardoso | \n",
" 250.078.710-95 | \n",
" paulo@inventado.com.br | \n",
"
\n",
" \n",
" 5 | \n",
" Edson Jardim | \n",
" 308.226.400-07 | \n",
" edson@inventado.com.br | \n",
"
\n",
" \n",
" 6 | \n",
" Ana Silva | \n",
" 344.246.630-00 | \n",
" anasilva@inventado.com.br | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Nome CPF e-mail\n",
"0 João Paulo 326.475.190-99 joao@inventado.com.br\n",
"1 Ana Silva 073.101.240-22 ana@inventado.com.br\n",
"2 Antonio Carlos 830.060.930-03 antonio@inventado.com.br\n",
"3 Saulo Santos 370.981.810-99 saulo@inventado.com.br\n",
"4 Paulo Cardoso 250.078.710-95 paulo@inventado.com.br\n",
"5 Edson Jardim 308.226.400-07 edson@inventado.com.br\n",
"6 Ana Silva 344.246.630-00 anasilva@inventado.com.br"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nome_cpf_email"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Tipicamente é bom possuir *index* únicos. Neste sentido, vamos definir o CPF como *index*:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"nome_cpf_mat = nome_cpf_mat.set_index('CPF')\n",
"nome_cpf_email = nome_cpf_email.set_index('CPF')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos agora realizar um **left** join com o *DataFrame* **nome_cpf_mat** ficando à esquerda (neste caso, apenas alunos com matrícula irão aparecer):"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Nome | \n",
" Matricula | \n",
" e-mail | \n",
"
\n",
" \n",
" CPF | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 326.475.190-99 | \n",
" João Paulo | \n",
" 8848484 | \n",
" joao@inventado.com.br | \n",
"
\n",
" \n",
" 073.101.240-22 | \n",
" Ana Silva | \n",
" 8451212 | \n",
" ana@inventado.com.br | \n",
"
\n",
" \n",
" 830.060.930-03 | \n",
" Antonio Carlos | \n",
" 5151213 | \n",
" antonio@inventado.com.br | \n",
"
\n",
" \n",
" 472.006.460-40 | \n",
" Debora Santos | \n",
" 51848484 | \n",
" NaN | \n",
"
\n",
" \n",
" 566.712.550-16 | \n",
" Rodrigo Gomes | \n",
" 1415816 | \n",
" NaN | \n",
"
\n",
" \n",
" 308.226.400-07 | \n",
" Edson Jardim | \n",
" 9592303 | \n",
" edson@inventado.com.br | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Nome Matricula e-mail\n",
"CPF \n",
"326.475.190-99 João Paulo 8848484 joao@inventado.com.br\n",
"073.101.240-22 Ana Silva 8451212 ana@inventado.com.br\n",
"830.060.930-03 Antonio Carlos 5151213 antonio@inventado.com.br\n",
"472.006.460-40 Debora Santos 51848484 NaN\n",
"566.712.550-16 Rodrigo Gomes 1415816 NaN\n",
"308.226.400-07 Edson Jardim 9592303 edson@inventado.com.br"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.merge(nome_cpf_mat, nome_cpf_email, how = 'left', on = ['Nome','CPF'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"- Na opção *how* dizemos qual o tipo de *join* que queremos realizar. \n",
"\n",
"- Na opção *on* dizemos quais as colunas que existem em comum nos *DataFrames*.\n",
"\n",
"Veja o que aconteceria se informássemos apenas que o *CPF* está presente nos dois *DataFrames*:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Nome_x | \n",
" Matricula | \n",
" Nome_y | \n",
" e-mail | \n",
"
\n",
" \n",
" CPF | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 326.475.190-99 | \n",
" João Paulo | \n",
" 8848484 | \n",
" João Paulo | \n",
" joao@inventado.com.br | \n",
"
\n",
" \n",
" 073.101.240-22 | \n",
" Ana Silva | \n",
" 8451212 | \n",
" Ana Silva | \n",
" ana@inventado.com.br | \n",
"
\n",
" \n",
" 830.060.930-03 | \n",
" Antonio Carlos | \n",
" 5151213 | \n",
" Antonio Carlos | \n",
" antonio@inventado.com.br | \n",
"
\n",
" \n",
" 472.006.460-40 | \n",
" Debora Santos | \n",
" 51848484 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 566.712.550-16 | \n",
" Rodrigo Gomes | \n",
" 1415816 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 308.226.400-07 | \n",
" Edson Jardim | \n",
" 9592303 | \n",
" Edson Jardim | \n",
" edson@inventado.com.br | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Nome_x Matricula Nome_y \\\n",
"CPF \n",
"326.475.190-99 João Paulo 8848484 João Paulo \n",
"073.101.240-22 Ana Silva 8451212 Ana Silva \n",
"830.060.930-03 Antonio Carlos 5151213 Antonio Carlos \n",
"472.006.460-40 Debora Santos 51848484 NaN \n",
"566.712.550-16 Rodrigo Gomes 1415816 NaN \n",
"308.226.400-07 Edson Jardim 9592303 Edson Jardim \n",
"\n",
" e-mail \n",
"CPF \n",
"326.475.190-99 joao@inventado.com.br \n",
"073.101.240-22 ana@inventado.com.br \n",
"830.060.930-03 antonio@inventado.com.br \n",
"472.006.460-40 NaN \n",
"566.712.550-16 NaN \n",
"308.226.400-07 edson@inventado.com.br "
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.merge(nome_cpf_mat, nome_cpf_email, how = 'left', on = 'CPF')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"Observe que os nomes dos alunos que estão na segunda tabela ficam indeterminados na coluna *Nome_y*."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos agora realizar um **right** join com o *DataFrame* **nome_cpf_mat** ficando à esquerda (neste caso, apenas alunos **com e-mail** irão aparecer):"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Nome | \n",
" Matricula | \n",
" e-mail | \n",
"
\n",
" \n",
" CPF | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 326.475.190-99 | \n",
" João Paulo | \n",
" 8848484.0 | \n",
" joao@inventado.com.br | \n",
"
\n",
" \n",
" 073.101.240-22 | \n",
" Ana Silva | \n",
" 8451212.0 | \n",
" ana@inventado.com.br | \n",
"
\n",
" \n",
" 830.060.930-03 | \n",
" Antonio Carlos | \n",
" 5151213.0 | \n",
" antonio@inventado.com.br | \n",
"
\n",
" \n",
" 370.981.810-99 | \n",
" Saulo Santos | \n",
" NaN | \n",
" saulo@inventado.com.br | \n",
"
\n",
" \n",
" 250.078.710-95 | \n",
" Paulo Cardoso | \n",
" NaN | \n",
" paulo@inventado.com.br | \n",
"
\n",
" \n",
" 308.226.400-07 | \n",
" Edson Jardim | \n",
" 9592303.0 | \n",
" edson@inventado.com.br | \n",
"
\n",
" \n",
" 344.246.630-00 | \n",
" Ana Silva | \n",
" NaN | \n",
" anasilva@inventado.com.br | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Nome Matricula e-mail\n",
"CPF \n",
"326.475.190-99 João Paulo 8848484.0 joao@inventado.com.br\n",
"073.101.240-22 Ana Silva 8451212.0 ana@inventado.com.br\n",
"830.060.930-03 Antonio Carlos 5151213.0 antonio@inventado.com.br\n",
"370.981.810-99 Saulo Santos NaN saulo@inventado.com.br\n",
"250.078.710-95 Paulo Cardoso NaN paulo@inventado.com.br\n",
"308.226.400-07 Edson Jardim 9592303.0 edson@inventado.com.br\n",
"344.246.630-00 Ana Silva NaN anasilva@inventado.com.br"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.merge(nome_cpf_mat, nome_cpf_email, how = 'right', on = ['Nome','CPF'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos agora realizar um **inner** join com o *DataFrame* **nome_cpf_mat** ficando à esquerda (neste caso, apenas alunos **com matrícula e com e-mail** irão aparecer):"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Nome | \n",
" Matricula | \n",
" e-mail | \n",
"
\n",
" \n",
" CPF | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 326.475.190-99 | \n",
" João Paulo | \n",
" 8848484 | \n",
" joao@inventado.com.br | \n",
"
\n",
" \n",
" 073.101.240-22 | \n",
" Ana Silva | \n",
" 8451212 | \n",
" ana@inventado.com.br | \n",
"
\n",
" \n",
" 830.060.930-03 | \n",
" Antonio Carlos | \n",
" 5151213 | \n",
" antonio@inventado.com.br | \n",
"
\n",
" \n",
" 308.226.400-07 | \n",
" Edson Jardim | \n",
" 9592303 | \n",
" edson@inventado.com.br | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Nome Matricula e-mail\n",
"CPF \n",
"326.475.190-99 João Paulo 8848484 joao@inventado.com.br\n",
"073.101.240-22 Ana Silva 8451212 ana@inventado.com.br\n",
"830.060.930-03 Antonio Carlos 5151213 antonio@inventado.com.br\n",
"308.226.400-07 Edson Jardim 9592303 edson@inventado.com.br"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.merge(nome_cpf_mat, nome_cpf_email, how = 'inner', on = ['Nome','CPF'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Por fim, vamos agora realizar um **outer** ou **full** join com o *DataFrame* **nome_cpf_mat** ficando à esquerda (neste caso, **todos** os alunos irão aparecer):"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Nome | \n",
" Matricula | \n",
" e-mail | \n",
"
\n",
" \n",
" CPF | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 326.475.190-99 | \n",
" João Paulo | \n",
" 8848484.0 | \n",
" joao@inventado.com.br | \n",
"
\n",
" \n",
" 073.101.240-22 | \n",
" Ana Silva | \n",
" 8451212.0 | \n",
" ana@inventado.com.br | \n",
"
\n",
" \n",
" 830.060.930-03 | \n",
" Antonio Carlos | \n",
" 5151213.0 | \n",
" antonio@inventado.com.br | \n",
"
\n",
" \n",
" 472.006.460-40 | \n",
" Debora Santos | \n",
" 51848484.0 | \n",
" NaN | \n",
"
\n",
" \n",
" 566.712.550-16 | \n",
" Rodrigo Gomes | \n",
" 1415816.0 | \n",
" NaN | \n",
"
\n",
" \n",
" 308.226.400-07 | \n",
" Edson Jardim | \n",
" 9592303.0 | \n",
" edson@inventado.com.br | \n",
"
\n",
" \n",
" 370.981.810-99 | \n",
" Saulo Santos | \n",
" NaN | \n",
" saulo@inventado.com.br | \n",
"
\n",
" \n",
" 250.078.710-95 | \n",
" Paulo Cardoso | \n",
" NaN | \n",
" paulo@inventado.com.br | \n",
"
\n",
" \n",
" 344.246.630-00 | \n",
" Ana Silva | \n",
" NaN | \n",
" anasilva@inventado.com.br | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Nome Matricula e-mail\n",
"CPF \n",
"326.475.190-99 João Paulo 8848484.0 joao@inventado.com.br\n",
"073.101.240-22 Ana Silva 8451212.0 ana@inventado.com.br\n",
"830.060.930-03 Antonio Carlos 5151213.0 antonio@inventado.com.br\n",
"472.006.460-40 Debora Santos 51848484.0 NaN\n",
"566.712.550-16 Rodrigo Gomes 1415816.0 NaN\n",
"308.226.400-07 Edson Jardim 9592303.0 edson@inventado.com.br\n",
"370.981.810-99 Saulo Santos NaN saulo@inventado.com.br\n",
"250.078.710-95 Paulo Cardoso NaN paulo@inventado.com.br\n",
"344.246.630-00 Ana Silva NaN anasilva@inventado.com.br"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.merge(nome_cpf_mat, nome_cpf_email, how = 'outer', on = ['Nome','CPF'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Os métodos *apply*, *map* e *applymap*\n",
"\n",
"A ideia é relativamente simples. Os três métodos são vetorizados e aplicam uma função ou uma substituição via dicionário de tal forma que:\n",
"\n",
"* *apply* é realizado via linha ou coluna em um *DataFrame*;\n",
"* *map* é aplicado a cada elemento de uma *Series*;\n",
"* *applymap* é aplicado a cada elemento de um *DataFrame*.\n",
"\n",
"Já vimos diversos exemplos de uso de `map`. Vejamos exemplos de `applymap` e `apply`."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"* Neste exemplo vamos retomar a concatenação entre os dados da Paraíba e do Brasil, porém iremos substituir *todos* os valores de `NaN` por zero, usando o métodp `applymap`."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" casosNovos | \n",
" obitosNovos | \n",
" casosBR | \n",
" obitosBR | \n",
"
\n",
" \n",
" data | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-09-26 | \n",
" 134.0 | \n",
" 2.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2021-09-25 | \n",
" 165.0 | \n",
" 2.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2021-09-24 | \n",
" 225.0 | \n",
" 3.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2021-09-23 | \n",
" 203.0 | \n",
" 3.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2021-09-22 | \n",
" 297.0 | \n",
" 6.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 2020-03-11 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 18.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-12 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 25.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-13 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 21.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-14 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 23.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2020-03-15 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 79.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
579 rows × 4 columns
\n",
"
"
],
"text/plain": [
" casosNovos obitosNovos casosBR obitosBR\n",
"data \n",
"2021-09-26 134.0 2.0 0.0 0.0\n",
"2021-09-25 165.0 2.0 0.0 0.0\n",
"2021-09-24 225.0 3.0 0.0 0.0\n",
"2021-09-23 203.0 3.0 0.0 0.0\n",
"2021-09-22 297.0 6.0 0.0 0.0\n",
"... ... ... ... ...\n",
"2020-03-11 0.0 0.0 18.0 0.0\n",
"2020-03-12 0.0 0.0 25.0 0.0\n",
"2020-03-13 0.0 0.0 21.0 0.0\n",
"2020-03-14 0.0 0.0 23.0 0.0\n",
"2020-03-15 0.0 0.0 79.0 0.0\n",
"\n",
"[579 rows x 4 columns]"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_PB_BR = pd.concat([covid_PB_casos_obitos, covid_BR_casos_obitos], axis=1)\n",
"dados_PB_BR.applymap(lambda valor: 0 if np.isnan(valor) else valor)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Vamos utilizar `apply` para realizar a soma de casos e óbitos através de mais de uma forma"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"casosNovos 440037\n",
"obitosNovos 9294\n",
"casosBR 2074860\n",
"obitosBR 78772\n",
"dtype: int64"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_PB_BR.apply(lambda x: np.sum(x)).astype('int')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Se quisermos realizar a operação por linhas, basta utilizar o argumento `axis=1`:"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"data\n",
"2021-09-26 False\n",
"2021-09-25 False\n",
"2021-09-24 False\n",
"2021-09-23 False\n",
"2021-09-22 False\n",
" ... \n",
"2020-03-11 False\n",
"2020-03-12 False\n",
"2020-03-13 False\n",
"2020-03-14 False\n",
"2020-03-15 False\n",
"Length: 579, dtype: bool"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dados_PB_BR.apply(lambda x: (x>0).all(), axis=1)"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
},
"latex_metadata": {
"affiliation": "Departamento de Computação Científica / UFPB",
"author": "Gustavo Oliveira e Andréa Rocha",
"date": "Julho de 2020",
"title": "Aula 6B - Manipulação de Dados"
},
"rise": {
"enable_chalkboard": true,
"footer": "UFPB - CI - DCC",
"header": "Gustavo Oliveira / Andrea Rocha",
"theme": "sky"
}
},
"nbformat": 4,
"nbformat_minor": 4
}