<jupyter_start><jupyter_text>Introdução ao Pandas - Viagens do Governo | Tratamento de dados *Esse notebook usa o arquivo sobre [viagens de funcionários do governo](http://www.portaltransparencia.gov.br/viagens) disponibilizado no portal da transparência.*<jupyter_code>import pandas as pd
df_viagem = pd.read_csv('viagens_2019.csv', encoding='latin-1', sep=';')<jupyter_output><empty_output><jupyter_text>**Saber informações sobre uma coluna específica**<jupyter_code>df_viagem['Valor passagens']<jupyter_output><empty_output><jupyter_text>**Mudar as virgulas dos valores por pontos**<jupyter_code># o str é pra sinalizar que a troca do replace é uma string
df_viagem['Valor passagens'] = df_viagem['Valor passagens'].str.replace(',','.')<jupyter_output><empty_output><jupyter_text>**Mudar o tipo de dado da coluna**<jupyter_code>df_viagem['Valor passagens'] = df_viagem['Valor passagens'].astype(float)<jupyter_output><empty_output><jupyter_text>**Contar quantas vezes aparece uma determinada coisa**<jupyter_code>df_viagem['Destinos'].value_counts()<jupyter_output><empty_output><jupyter_text>**Separar as cidades dos Estados ou Países**O `split()` guarda o resultado em uma **lista**<jupyter_code># O parametro 'expand = True' indica que os elementos devem ser separados em diferentes colunas
col = df_viagem['Destinos'].str.split('/',1,expand = True)<jupyter_output><empty_output><jupyter_text>**Incluir a coluna nova no dataframe**<jupyter_code>df_viagem['cidade_destino'] = col[0]<jupyter_output><empty_output><jupyter_text>**Separar conteudos diferentes que estão na mesma coluna**A coluna do dataframe possui valores nulos, estados e países misturados. Para resolver isso é preciso identificar **padrões**. No caso desse dataframe, o padrão é: - **Estados** tem só **2 caracteres**- **Paises** estão escritos com nome completo, ou seja tem mais caracteres- Valores **nulos** estão escritos **None**Antes de tudo, vou armazenar o conteudo bagunçado em uma coluna que chamarei de 'Provisoria'<jupyter_code>df_viagem['Provisoria'] = col[1]<jupyter_output><empty_output><jupyter_text>**Criando um dataframe para cada conteudo separado**Todos os dataframes vão ter uma coluna chamda 'Provisoria' com o conteudo separado por conteudo que foi filtrado a partir do dataframe original 'df_viagem'. Para isso filtrarei usando a função `len()`. Essa função apresenta a quantidade de conteúdo que for passado por parametro. Criando um dataframe com o conteudo de estados<jupyter_code>#Estou colocando na coluna estado o conteudo da coluna provisória que tenha apenas dois caracteres
estado = df_viagem[df_viagem['Provisoria'].str.len()==2]<jupyter_output><empty_output><jupyter_text>Agora vou criar um dataframe com o conteudo de paises, incluindo nele todo conteudo que tenha informações maior que dois caracteres<jupyter_code>pais = df_viagem[df_viagem['Provisoria'].str.len() > 2]<jupyter_output><empty_output><jupyter_text>E por fim vou criar um dataframe com o conteudo None. A função `isnull()` identifica os valores nulos no dataframe. No caso do exemplo está identificando na coluna 'Provisoria'<jupyter_code>nulo = df_viagem[df_viagem['Provisoria'].isnull()]<jupyter_output><empty_output><jupyter_text>**Renomeado as colunas dos dataframes** Se na coluna 'Provisoria' do dataframe 'estado' só tem o conteudo relacionado aos estados, basta renomear a coluna 'Provisoria' para 'estado'.<jupyter_code>#No dicionario é passado na chave o nome da coluna antiga e no valor o nome que quer renomear
#O inplace serve para tornar a mudança definitiva

estado.rename(columns = {'Provisoria' : 'estado'}, inplace = True)<jupyter_output><empty_output><jupyter_text>Todas os estados são relacionados ao Brasil. Então vou criar dentro do dataframe 'estado' a coluna 'pais' e incluir o conteudo 'Brasil'<jupyter_code>estado['país'] = 'Brasil'<jupyter_output><empty_output><jupyter_text>No dataframe 'pais' vou renomear a coluna 'Provisoria' para 'país'<jupyter_code>pais.rename(columns = {'Provisoria' : 'país'}, inplace = True)<jupyter_output><empty_output><jupyter_text>Como os outros paises não tem a informação do estado (no caso desse dataframe), vou criar uma coluna 'estado' e incluir o conteudo 'Sem informação'<jupyter_code>pais['estado'] = 'Sem informação'<jupyter_output><empty_output><jupyter_text>No dataframe nulo, vou renomear a coluna 'Provisoria' para 'estado'<jupyter_code>nulo.rename(columns = {'Provisoria' : 'estado'}, inplace = True)<jupyter_output><empty_output><jupyter_text>E inserir uma coluna 'país' com o conteudo 'Sem informação'<jupyter_code>nulo['país'] = 'Sem informação'<jupyter_output><empty_output><jupyter_text>Vou mudar o conteudo 'None' da coluna 'Estado' para 'Sem informação'<jupyter_code>nulo['estado'] = 'Sem informação'<jupyter_output><empty_output><jupyter_text>**Ordenando Colunas** A ordem das colunas novas nos novos dataframes deveria ser 'cidade_destino', 'estado' e 'pais', mas essa ordem está diferente no dataframe 'pais'. Vou reordenar para todos ficarem iguais.  1. Pegarei o nome de todas as colunas<jupyter_code>pais.columns<jupyter_output><empty_output><jupyter_text>2. Agora copio todas as colunas dentro dos colchetes duplos na ordem que eu considerar certa<jupyter_code>pais = pais[['Identificador do processo de viagem', 'Situação',
       'Código do órgão superior', 'Nome do órgão superior',
       'Código órgão solicitante', 'Nome órgão solicitante', 'CPF viajante',
       'Nome', 'Cargo', 'Período - Data de início', 'Período - Data de fim',
       'Destinos', 'Motivo', 'Valor diárias', 'Valor passagens',
       'Valor outros gastos', 'cidade_destino', 'estado', 'país']]<jupyter_output><empty_output><jupyter_text>**Juntar os 3 dataframes em 1**<jupyter_code>#ignore_true serve pra ignorar o indice de cada dataframe, se não vai ser impossivel junta-los

df_final = pd.concat([estado, pais, nulo], ignore_index = True)<jupyter_output><empty_output><jupyter_text>**Removendo uma coluna**Agora não faz mais sentido ter a coluna 'Destinos' afinal ela já foi tratada. Usarei o método `drop()` para fazer isso.<jupyter_code>#O axis indica se eu quero fazer minha alteração em uma linha ou em uma coluna. 1 é coluna, 0 é linha.

df_final.drop('Destinos', inplace = True, axis = 1)<jupyter_output><empty_output><jupyter_text>**Salvando um arquivo em csv**É importante depois de tratado gerar um arquivo novo para não precisar rodar tudo e novo.<jupyter_code>df_final.to_csv('viagens_tratado_2019.csv', encoding = 'latin-1', sep = ';')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10601411475912857, 'fraction_numerical': 0.0035286897821417613, 'mean_word_length': 7.357692307692307, 'pattern_counts': {'":': 0, '<': 93, '<?xml version=': 0, '>': 94, 'https://': 0, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '23', 'dir': 'jupyter-structured-clean-dedup', 'id': '4353', 'license': 'MIT', 'n_tokens_mistral': 2405, 'n_tokens_neox': 2370, 'n_words': 647, 'path': 'Tratamento de dados.ipynb', 'repo_name': 'anicelysantos/jornalismo-de-dados-udemy', 'size': '6518'}