Truques do Pandas Para seu Dia ser Produtivo.
Importe as Bibliotecas básicas:
# Importar as Libsimport pandas as pd
import numpy as np# Comando para bloquear tela vermelha que informa atualização no Jupterpd.options.mode.chained_assignment = None
Leitura de Arquivo CSV — Utilizando Paralelismo
# Utilizando Paralelismo = Leitura mais rápida
df = pd.read_csv('../input/A.csv', sep=';', engine='pyarrow')
Leitura de Arquivo Microsoft Excel .XSLX — Forma direta
# forma direta
df = pd.read_excel('A.xlsx', dtype='object') # Leitura do excel
Leitura de Arquivo Microsoft Excel .XSLX
# Nome do Arquivo
file = 'A.xlsx'# Carregar spreadsheet
xl = pd.ExcelFile(file)# Print o nome dos sheets
print(xl.sheet_names)# Carregar sheet em um DataFrame com o nome: df
df = xl.parse('Exportar Planilha')
Reduza o Tamanho do arquivo: Utilize PARQUET
# Transforma o df em um formato mais compactodf.to_parquet('total.parquet')df = pd.read_parquet('total.parquet', engine='pyarrow')
Selecionar Todos os Dados com base no valor de uma Coluna
# Filtra os dados com base no valor de uma coluna, retorna todas as colunas do df aplicando o filtro nos registros com base no NOME_COLUNA e VALOR_DESEJADOselecao = (df['NOME_COLUNA'] == 'VALOR_DESEJADO') df1 = df[selecao]# Para selecionar multiplos valore utileze a seguinte forma:selecao = ['valor1', 'valor2']
df1_Temp = df1[d1.NomedoCampo.isin(selecao)]
Selecionar Todos os Dados com base em Filtro de Texto
# Seleciona todos os dados do df1 exceto os que contem as Palavra1 ou (|) Palavra2. Para vizualizar o oposto utilizar True no lugar do Falsedf1 = df1[df1["NOME_COLUNA"].str.contains('Palavra1|Palavra2')==False]
Selecionar Todos os Dados Nulos e Não Nulos
# Filtra o df com base em valores nulos de uma coluna
df1 = df[df["NOME_COLUNA"].isnull()]# Filtra o df com base em valores não nulos de uma coluna
df1 = df[~df["NOME_COLUNA"].isnull()]
Selecionar Colunas específicas de um Data Frame (df)
# selecionar apenas algumas colunas do dfdf = df[['NOME_COLUNA','NOME_COLUNA','NOME_COLUNA','NOME_COLUNA']]
Selecionar Colunas que Começam com um Nome Específico
# Retorna o nome de todas as colunas que se inicia com a palavra "DATA"
temp = df.loc[:, df.columns.str.startswith("DATA")]
Criando uma Nova Coluna (Juntar Valores e colocar um Separador)
# Junção de valores de colunas em uma nova coluna utilizando um separadordf1['NOVA_COLUNA'] = df1[['NOME_COLUNA_1', 'NOME_COLUNA_2', 'NOME_COLUNA_3']].astype(str).agg('-'.join, axis=1)
Criando uma Nova Coluna (Com a Contagem ou Soma de outras Colunas)
# Nova coluna com agrupamento e operações matemáticas# Contagem
df1['NOVA_COLUNA'] = df1.groupby(['NOME_COLUNA_1', 'NOME_COLUNA_2'])['NOME_COLUNA_OBJETIVO'].transform('count')# Soma
df1['NOVA_COLUNA'] = df1.groupby(['NOME_COLUNA_1', 'NOME_COLUNA_2'])['NOME_COLUNA_OBJETIVO'].transform('sum')# Contagem Valores Únicos
df1['NOVA_COLUNA'] = df1.groupby(['NOME_COLUNA_1', 'NOME_COLUNA_2'])['NOME_COLUNA_OBJETIVO'].transform('nunique')
Criando uma Nova Coluna (Com condicionais)
# Nova coluna com base em valores condicionais e atribuição de outras colunas# Passando colunas do df1 com condições
df1['NOVA_COLUNA'] = np.where(df1['NOME_COLUNA_1'] >= 0, df1['NOME_COLUNA_2'], df1['NOME_COLUNA_3'])# Passando valores como condições
df1['NOVA_COLUNA'] = np.where(df1['NOME_COLUNA_1'] >= 0, "Verdadeiro", "Falso")# Criando uma coluna com mais de um condicional e com multiplas condições.df['NOVA_COLUNA'] = np.where((df['NOME_COLUNA_1'] == 4) & (df['NOME_COLUNA_2'] >= 100), 1,0) + np.where((df['NOME_COLUNA_1'] != 4) & (df['NOME_COLUNA_2'] >= 200), 1, 0)Note que existe duas condições com np.where, cada uma representa uma estrutura condicional sendo a primeira o "IF" mais interno e o após o sinal de "+" é o mais externo. exemplo:se condição1 atender dois critérios:
- Realizar uma ação...
se condição2 atender os critérios:
- Realizar uma ação...
Trabalhando com Datas (Convertendo o tipo de campo para data)
# Transforma a coluna COLUNA_DATA no formato de data considerando apenas mês, dia e anodf["COLUNA_DATA"]= pd.to_datetime(df["COLUNA_DATA"]).dt.date
Criando nova coluna do tipo data (realizando soma de dias e anos)
# Atribua um valor no formato aceito no pandas
df['NOVA_COLUNA_DATA'] = '2019-10-10 07:15:11'# Certifique-se que a coluna realmente será do tipo de df['NOVA_COLUNA_DATA'] = pd.to_datetime(df['NOVA_COLUNA_DATA']).dt.date# Realize a Soma de Anos
df['NOVA_COLUNA_DATA'] = df['COLUNA_DATA'] + pd.DateOffset(years=3)# Realize a Soma de dias
df['NOVA_COLUNA_DATA'] = df['COLUNA_DATA'] + pd.DateOffset(days=25)
Criando nova coluna do tipo data (realizando comparações condicionais entre datas)
# Quando verdadeiro o valor da nova coluna será 2019-10-10, Quando falso será 2020-10-10df['NOVA_COLUNA_DATA'] = np.where((df['COLUNA_DATA_1'] < df['COLUNA_DATA_2']) & (df['NOME_COLUNA_1'] == 2), "2019-10-10", "2020-10-10")# Para passar como paâmetro outras colunas do tipo de data é necessário um processo de transformação das colunas desejadas. O np.where aceita somente array np# Quando Positivo
vetor_COLUNA_DATA_1 = df['COLUNA_DATA_1'].to_numpy()
x = [np.datetime64(i) for i in vetor_COLUNA_DATA_1]
x = pd.to_datetime(x)# Quando Negativo
vetor_COLUNA_DATA_2 = df2['COLUNA_DATA_2'].to_numpy()
y = [np.datetime64(i) for i in vetor_COLUNA_DATA_2]
y = pd.to_datetime(y)df['NOVA_COLUNA_DATA'] = np.where((df['COLUNA_DATA_1'] < df['COLUNA_DATA_2']) & (df['NOME_COLUNA_1'] == 2), [str(i.date()) for i in x], [str(i.date()) for i in y])
Contando as Frequencias
# Contando as frequencias (ocorrência) de uma classe:df['NOME_COLUNA'].value_counts() # Para calcular a porcentagem (%) de cada classe utilize:df['NOME_COLUNA'].value_counts(normalize = true) * 100# Melhorando a visualização dos percentuais:frequencia = df['NOME_COLUNA'].value_counts()
percentual = df['NOME_COLUNA'].value_counts(normalize = true) * 100# Constroi um DataFrame com as frequencias de classes:freq_qualitativas = pd.DataFrame({'Frequência': frequencia, 'Porcentagem (%)': percentual})
Criando classes personalizadas com faixas de valores
# Imagine que você tenha faixas de valores e gostaria de colocalas em faixas personalizadas:exemplo:
A: acima de R$15.760,00;
B: de R$7.880,00 até R$15.760,00;
C: de R$3.152,00 até R$ 7.880,00;
D: de R$1.576,00 até R$3.152,00;
E: de zero até R$1.576,00.1 - identifique os valores mínimos e máximos:df.Renda.min() e df.Renda.max()2 - construa as classes baseado nos mínimos e máximos:classes = [0, 1576, 3152, 7880, 15760, 200000]3 - Construa os Labels das classes:labels = ['E', 'D', 'C', 'B', 'A']4 - Utilize a função CUT do Pandas:pd.cut(x = df.Renda,
bins = classes,
labels = labels,
include_lowest = True)obs: o parâmetro include_lowest = True serve para poder adcionar o zero na primeira faixa, por padrão o zero não está incluso.id classe
0 E
1 E
2 E
3 C
4 E
Comandos Complementares
# Quantidade de Linhas e Colunas
df.shape# Nome das Colunas
df.columns# Contagem de dados não-nulos
df.count()# Resumo estatístico do DataFrame, com quartis, mediana, etc.
df.describe()# Informações do df
df.info()# Soma de Valores Nulos
df.isnull().sum()# Salvar para CSV
df.to_csv('df_Completo', sep=';', encoding='utf-8')# Filtro de Dataframe
df[(df['Compra']=='B') & (df['Pessoas']=='2020')]