20 funções úteis para Análise de Dados com Pandas

Fonte: Medium Soner Yıldırım

Pandas é uma biblioteca de análise de dados Python predominantemente usada, fornecendo muitas funções e métodos para agilizar o processo de análise de dados.

Neste passo a passo, veremos 20 funções de Pandas com exemplos, todos eles agregarão valor ao seu processo de análise de dados. Vamos direto ao ponto.

Importando bibliotecas

import numpy as np
import pandas as pd

1. Consultas: .query()

values_1 = np.random.randint(10, size=10)
values_2 = np.random.randint(10, size=10)
years = np.arange(2010,2020)
groups = ['A','A','B','A','B','B','C','A','C','C']
df = pd.DataFrame({
'group':groups,
'year':years,
'value_1':values_1,
'value_2':values_2})
df

Vamos primeiro criar um DataFrame de amostra df.

Formulando DataFrame df

É muito simples usar a função de consulta, apenas requer a passagem da condição de filtragem.

df.query('value_1 < value_2')
Exemplo de consulta com query

2. Adicionar nova coluna: .insert()

Precisamos especificar a posição passando um índice como primeiro argumento. Este valor deve ser um inteiro. Os índices das colunas começam de zero, assim como os índices de linha. O segundo argumento é o nome da coluna e o terceiro argumento é o objeto que inclui valores que podem ser Série ou um objeto semelhante a uma matriz.

# Nova coluna
new_col = np.random.randn(10)
# Inserindo a nova coluna na posição 2
df.insert(2, 'new_col', new_col)df
Exemplo criação de coluna

3. Soma Cumulativa: .cumsum()

Se aplicarmos apenas cumsum, grupos (A, B, C) serão ignorados. Esse tipo de valor cumulativo pode ser inútil em alguns casos porque não somos capazes de distinguir entre grupos, então devemos aplicar groupby e, em seguida, função cumsum.

# definindo soma cumulativa
df['cumsum_2'] = df[['value_2','group']].groupby('group').cumsum()
# ordenando grupos
df.sort_values(by=['group'])
df
Exemplo de soma cumulativa

4. Amostagem: .sample()

sample1 = df.sample(n=3); sample1
Exemplo de amostragem

Especificamos o número de valores com n parâmetro, mas também podemos passar uma razão para parâmetro frac. Por exemplo, 0,5 retornará metade das linhas.

sample2 = df.sample(frac=0.5); sample2
Exemplo amostra fracionada em 50%

Para obter amostras reprodutíveis, podemos usar o parâmetro random_state. Se um valor inteiro for passado para random_state, a mesma amostra será produzida toda vez que o código for executado.

5. Onde: .where()

df['new_col'].where(df['new_col'] > 0 , 0)

A forma como “onde” funciona é que os valores que se encaixam na condição são selecionados e os demais valores são substituídos pelo valor especificado. onde (df[‘new_col’]>0, 0) seleciona todos os valores em “new_col” que são maiores que 0 e os demais valores são substituídos por 0. Assim, onde também pode ser considerado como uma operação de máscara.

Um ponto importante é que “onde” para Pandas e NumPy não são exatamente os mesmos. Podemos alcançar o mesmo resultado, mas com sintaxes ligeiramente diferente.

Com o DataFrame.where, os valores que se encaixam na condição são selecionados como estão e os outros valores são substituídos pelo valor especificado. Np.where requer também especificar o valor para aqueles que se encaixam na condição. As duas linhas a seguir retornam o mesmo resultado:

# aplicação com Pandas DataFrame
df['new_col'].where(df['new_col'] > 0, 0)
# aplicação com NumPy array
np.where(df['new_col'] > 0, df['new_col'], 0)

6. Contém: isin()

years = ['2010','2014','2017']
df[df.year.isin(years)]
Exemplo de filtragem .isin

7. Loc and iloc

  • loc: seleção por rótulos
  • iloc: selecão por posições

loc é usado para selecionar dados por rótulo. Os rótulos das colunas são os nomes das colunas. Precisamos ter cuidado com rótulos de linha. Se não atribuirmos nenhum índice específico, Pandas criará um índice inteiro por padrão. Assim, os rótulos de linha são inteiros a partir de 0 e subindo. As posições de linha que são usadas com iloc também são inteiros a partir de 0.

Selecionando as primeiras 3 linhas e as primeiras 2 colunas com iloc:

df.iloc[:3, :2]
Retornando 3 primeiras linhas e 2 primeiras colunas com iloc

Selecionando as primeiras 3 linhas e as primeiras 2 colunas com loc:

df.loc[:2, ['group', 'year']]
Retornando 3 primeiras linhas e 2 primeiras colunas com loc

8. Variação percentual: .pct_change

df.value_1.pct_change()
Variação percentual de valores de um atributo (Series)

9. Ranqueamento: .rank()

# criando atributo de ranqueamento "rank_1" através de "value_1"df['rank_1'] = df['value_1'].rank(); df
Ranqueando valores de uma coluna com .rank

10. Derreter: .melt()

Criando df_wide de dimensão “larga”

Temos três cidades (A, B e C) e medições diferentes feitas em 5 dias diferentes. Decidimos representar esses dias como filas em uma coluna. Haverá também uma coluna para mostrar as medidas. Podemos facilmente conseguir isso usando a função melt:

df_wide.melt(id_vars=['city'])
“Derretendo” o DataFrame com a função .melt

Nomes de colunas de variável e valor são dados por padrão. Podemos usar var_name e value_name parâmetros da função melt para atribuir novos nomes de colunas.

11. Explodir: .explode()

Criando linha com mais de uma observação
df1.explode('measurement').reset_index(drop=True)
Explodindo a linha em mais linhas com .explode

12. .nunique()

df inicial
df.year.nunique()df.group.nunique()
nunique retorna valores únicos de anos e de grupos

Podemos aplicar diretamente a função nunique ao dataframe e ver o número de valores únicos em cada coluna:

df.nunique()

Se o parâmetro do eixo for definido para (axis=1), nunique retorna o número de valores únicos em cada linha.

13. Busca com: .lookup()

Para cada dia dos 8 dias, temos medições de 4 pessoas e uma coluna que inclui os nomes dessas 4 pessoas.

Queremos criar uma nova coluna que mostre a medição da pessoa na coluna “person”.

Assim, para a primeira linha, o valor na nova coluna será de 4 (o valor na coluna “Alex”).

df['Person_point'] = df.lookup(df.index, df['Person']); df

14. Inferir tipos de dados: infer_objects

infer_objects tenta inferir melhores tipos de dados para colunas de objetos. Considere o seguinte dataframe:

df.dtypes

Todos os tipos de dados são objeto. Vamos ver quais são os tipos de dados inferidos:

df.infer_objects().dtypes

Pode parecer trivial, mas definitivamente será útil quando houver muitas colunas.

15. Uso de memória: .memory_usage()

df_large = pd.DataFrame(
{'A': np.random.randn(1000000),
'B': np.random.randint(100, size=1000000)})
df_large.shape
(1000000, 2)

E o uso de memória para cada coluna em bytes:

df_large.memory_usage()
Uso de memória

Uso de memória de todo o dataframe em megabytes:

df_large.memory_usage().sum() / (1024**2) #conversão em mbytes
Uso de memória do DataFrame

16. Estatística básica: .describe()

Estatísticas básicas

17. Mesclar: .merge()

Podemos mesclá-los com base em valores compartilhados em uma coluna. O parâmetro que define a condição para a fusão é o parâmetro “on”.

df1 e df2 são mesclados com base nos valores comuns em column_a.

O parâmetro da função de mesclagem permite combinar dataframes de diferentes maneiras. Os possíveis valores de como são ‘interior’, ‘externo’, ‘esquerda’, ‘direita’.

  • interior: apenas linhas com os mesmos valores na coluna especificada pelo parâmetro (valor padrão de como parâmetro)
  • exterior: todas as linhas
  • esquerda: todas as linhas do DataFrame esquerdo
  • direito: todas as linhas do DataFrame direito

18. Select_dtypes

df.select_dtypes(include='int64')df.select_dtypes(exclude='int64')

19. Substituir: .replace()

df.replace('A', 'A_1')

O primeiro parâmetro é o valor a ser substituído e o segundo é o novo valor.

Também podemos passar em um dicionário para várias substituições ao mesmo tempo.

df.replace({'A':'A_1', 'B':'B_1'})

20. Aplicar: .applymap()

Por exemplo, se quisermos múltiplos cada elemento por um número, não precisamos e não devemos usar a função applymap. Uma operação simples vetorializada (por exemplo, df * 4 ) é muito mais rápida nesse caso.

No entanto, pode haver alguns casos em que não temos a opção de operação vetorializada. Por exemplo, podemos alterar o estilo de um dataframe usando a propriedade Style de dataframes pandas. A função a seguir altera a cor dos valores negativos como vermelho.

def color_negative_values(val):
color = 'red' if val < 0 else 'black'
return 'color: %s' % color

Precisamos usar a função applymap para aplicar essa função a um dataframe.

df.style.applymap(color_negative_values)

Composing a repository of books (i bought), authors (i follow) & blogs (direct ones) for my own understanding.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store