Truques do Pandas Para seu Dia ser Produtivo.

Diego de Castro Rodrigues
5 min readNov 21, 2021

--

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')
Photo by Anton Chernyavskiy on Unsplash

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')
Photo by Kamil S on Unsplash

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")]
Photo by Katie Moum on Unsplash

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...
Photo by Waldemar Brandt on Unsplash

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])
Photo by Carl Heyerdahl on Unsplash

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')]

--

--

Diego de Castro Rodrigues

Ciêntista de Dados | Professor | Desenvolvedor | Pesquisador