<jupyter_start><jupyter_text>Pandas Nessa aula, vamos ver o básico do Pandas, uma biblioteca poderosa para trabalhar com dados tabulares, como CSV.Vamos ver:* Importar Pandas* Ler um CSV* Explorar e filtrar dados* Escrever um CSV  Importar Pandas<jupyter_code>import pandas as pd<jupyter_output><empty_output><jupyter_text>Para ler um arquivo CSV, usaremos a função `pd.read_csv ()` e inseriremos o nome do caminho de arquivo desejado.<jupyter_code>quotes_df = pd.read_csv('CSVs/quotes_aula_final.csv')<jupyter_output><empty_output><jupyter_text>Isso cria um [objeto DataFrame](https://pandas.pydata.org/pandas-docs/stable/user_guide/dsintro.htmldataframe) Pandas - geralmente abreviado como * df *, por exemplo, *quotes_df*. Um DataFrame se parece e age muito como uma planilha. Mas tem poderes e funções especiais.Ao ler o arquivo CSV, também especificamos a `encoding` e o` delimiter`. O `delimiter` especifica o caractere que separa ou "delimita" as colunas em nosso conjunto de dados. Para arquivos CSV, o delimitador geralmente será uma vírgula. (CSV é a abreviação de *Valores separados por vírgula*.) Às vezes, no entanto, o delimitador de um arquivo CSV pode ser uma tabulação (`\ t`) ou, mais raramente, outro caractere. Mostrar dadosPodemos exibir um DataFrame em um notebook Jupyter simplesmente executando uma célula com o nome da variável do DataFrame.<jupyter_code>quotes_df<jupyter_output><empty_output><jupyter_text>* Index  * Os números crescentes na coluna da extrema esquerda do DataFrame são chamados de *Index*. Você pode selecionar linhas com base no índice.  * Por padrão, o Index é uma sequência de números começando com zero. No entanto, você pode alterar o index para outra coisa, como uma das colunas em seu conjunto de dados.<jupyter_code># index_col=0 -> coluna 0 é o index
quotes_df = pd.read_csv('CSVs/quotes_aula_final.csv' , sep=',', index_col=0) 
quotes_df<jupyter_output><empty_output><jupyter_text>Exibir as primeiras *n* linhasPara examinar as primeiras n linhas em um DataFrame, podemos usar um método chamado `.head()`.<jupyter_code>quotes_df.head()
quotes_df.head(10)<jupyter_output><empty_output><jupyter_text>Ver as últimas *n* linhas<jupyter_code>quotes_df.tail()<jupyter_output><empty_output><jupyter_text>Para obter informações importantes sobre todas as colunas no DataFrame, podemos usar `.info()`.<jupyter_code>quotes_df.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 0 to 99
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   Autor   100 non-null    object
 1   Texto   100 non-null    object
 2   Tags    97 non-null     object
dtypes: object(3)
memory usage: 3.1+ KB<jupyter_text>Este relatório nos dirá quantos valores não nulos ou não em branco estão em cada coluna, bem como qual *tipo* de dados está em cada coluna.| **Pandas Data Type** |  **Explicação**                                                                                   ||:-------------:|:---------------------------------------------------------------------------------------------------:|| `object`         | string                                                                               || `float64`         | float                                               || `int64`       | integer                                                        || `datetime64`       |  date time<jupyter_code>quotes_df.shape<jupyter_output><empty_output><jupyter_text>Analisar as colunas<jupyter_code>quotes_df.columns
# tipo dos dados das colunas
quotes_df.dtypes<jupyter_output><empty_output><jupyter_text>Selecionar uma colunaPara selecionar uma coluna do DataFrame, digitaremos o nome do DataFrame seguido por colchetes e um nome de coluna entre aspas.<jupyter_code>quotes_df['Autor']<jupyter_output><empty_output><jupyter_text>Tecnicamente, uma única coluna em um DataFrame é um objeto [*Series*](https://pandas.pydata.org/pandas-docs/stable/user_guide/dsintro.htmldsintro).<jupyter_code>type(quotes_df['Autor'])<jupyter_output><empty_output><jupyter_text>Um objeto Series é exibido de maneira diferente de um objeto DataFrame. Para selecionar uma coluna como DataFrame e não como objeto Series, usaremos dois colchetes.<jupyter_code>quotes_df[['Autor']]
type(quotes_df[['Autor']])<jupyter_output><empty_output><jupyter_text>Usando dois colchetes, também podemos selecionar várias colunas ao mesmo tempo.<jupyter_code>quotes_df[['Autor','Tags']]<jupyter_output><empty_output><jupyter_text>E se colocarmos apenas um colchete?<jupyter_code>quotes_df['Autor','Tags']

# renomear colunas
quotes_df.rename(columns={'Autor':'AUTOR', 'Tags':'TAGS'}, inplace=True)
quotes_df.head(2)<jupyter_output><empty_output><jupyter_text>Substituir strings nas linhas de uma coluna<jupyter_code>quotes_df['TAGS'] = quotes_df['TAGS'].str.replace(',', ' - ')
quotes_df.head(2)<jupyter_output><empty_output><jupyter_text>Contar valores Para contar o número de valores *únicos* em uma coluna, podemos usar o método `.value_counts()`.<jupyter_code>quotes_df['AUTOR'].value_counts()
type(quotes_df['AUTOR'].value_counts())<jupyter_output><empty_output><jupyter_text>Filtrar/Subconjunto de Dados Podemos filtrar um DataFrame Pandas para selecionar apenas alguns valores. Filtrar dados por determinados valores é semelhante a selecionar colunas.Digitamos o nome do DataFrame seguido por colchetes e então, em vez de inserir um nome de coluna, inserimos uma condição Verdadeiro/Falso. Por exemplo, para selecionar apenas linhas que contenham o valor "<NAME>", inserimos a condição `quotes_df ['Autor'] == '<NAME>'`<jupyter_code>quotes_df[quotes_df['AUTOR'] == '<NAME>']
# filtrar coluna que contenha algum valor usando contains
quotes_df[quotes_df['TAGS'].str.contains('life')]
# if the value is NA, then replace it with the value of the column
quotes_df['TAGS'].fillna('SEM TAGS', inplace=True)
quotes_df[quotes_df['TAGS'].str.contains('life')]<jupyter_output><empty_output><jupyter_text>E se colocarmos apenas o que queremos filtrar?<jupyter_code>quotes_df[quotes_df['AUTOR'] == '<NAME>']
quotes_df['AUTOR'] == '<NAME>'<jupyter_output><empty_output><jupyter_text>Filtrar DataFrames às vezes pode ser confuso e difícil de manejar (à medida que as condições dentro das condições se acumulam). Pode ser útil criar uma variável separada para um filtro, como a seguir.<jupyter_code>einstein_filter = quotes_df['AUTOR'] == '<NAME>'
monroe_fiilter = quotes_df['AUTOR'] == '<NAME>'
quotes_df[monroe_fiilter]
einstein_df = quotes_df[einstein_filter]
monroe_df = quotes_df[monroe_fiilter]<jupyter_output><empty_output><jupyter_text>Salvar como CSV<jupyter_code>einstein_df.to_csv("CSVs/einstein.csv", encoding='utf-8', index=True)
monroe_df.to_csv("CSVs/monroe.csv", encoding='utf-8', index=False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11840752166887028, 'fraction_numerical': 0.005582488614661378, 'mean_word_length': 4.5894909688013135, 'pattern_counts': {'":': 0, '<': 88, '<?xml version=': 0, '>': 89, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 10, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '20', 'dir': 'jupyter-structured-clean-dedup', 'id': '581696', 'license': 'MIT', 'n_tokens_mistral': 2428, 'n_tokens_neox': 2355, 'n_words': 603, 'path': 'sem10-11_Python/pandas_01.ipynb', 'repo_name': 'saaracastro/PPGCS012-materiais', 'size': '6869'}