Top 10 comandos Pandas

Os melhores comandos Pandas que me ajudam diariamente na análise de dados


João Oliveira

O pandas é uma das melhores e mais conhecidas bibliotecas para análise de dados. Quando começei a trabalhar com análise de dados eu usava a linguagem R, porém, mesmo sabendo de todo poder e potêncial da linguagem, a sintaxe pra mim era estranha e não muito familiar. Foi ai que conheci a bilioteca Pandas que foi construída em Python, um linguagem de programação fácil e direta. Sem mais delongas, vou deixar a lista aqui dos comandos que mais me ajudaram e que acho mais importante para quem trabalha com dados.

Segue lista dos comandos mais utilizados:

>>> import pandas as pd
>>> pandas.__version__
'1.1.4'
  • pd.descibe()
  • pd.info()
  • pd.groupby()
  • pd.iloc[], pd.loc[]
  • pd.at[]
  • pd.sort_values()
  • pd.apply()
  • pd.value_counts()t()
  • pd.concat()
  • pd.itertuples()

Pra ficar mais legal, vou falar um pouco sobre cada uma. E como cada comando dessa lista me ajuda nas atividades diárias de processamento e análise de dados.

pd.describe()

O Describe do pandas é sem dúvida um dos primeiros comandos que utilizo quando vou investigar uma base de dados. Recentemente, recebi uma crítica de um revisor de artigos de revista científica que eu havia apresentado somente a média de alguns dados, e para uma análise mais detalhada, eu deveria apresentar outras medidas de média, logo, me lembrei do comando describe do pandas que fazia essa função. Ao executar o comando você terá: a quantidade de amostras, média, desvio padrão, mínimo, máximo, primeiro, segundo e terceiro quartil.

>>> data = pd.Series([1, 2, 3])
>>> data.describe()
count    3.0
mean     2.0
std      1.0
min      1.0
25%      1.5
50%      2.0
75%      2.5
max      3.0
dtype: float64

pd.info()

Se o describe é um dos primeiros comandos que utilizo, o info é sem dúvidas o primeiro. Quando você carrega uma base de dados para uma estrutura pandas o comando info te pertmite ter uma visão geral das colunas, tipo dos dados e shape da base.

>>> df.info(verbose=True)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
 #   Column     Non-Null Count  Dtype
---  ------     --------------  -----
 0   int_col    5 non-null      int64
 1   text_col   5 non-null      object
 2   float_col  5 non-null      float64
dtypes: float64(1), int64(1), object(1)
memory usage: 248.0+ bytes

pd.groupby()

Quando quero combinar informações o groupby é o cara que me permite economizar tempo e gerar insights rápidos. Pra quem utiliza SQL diariamente vai se familiarizar rápido, combine atributos e extrai uma métrica, seja ela média, tamanho ou contagem. Esse comando combinado com agregação te permite resultados bem mais precisos para atividades complexas.

>>> df = pd.DataFrame({'Animal': ['Falcon', 'Falcon','Parrot', 'Parrot'],
                       'Max Speed': [380., 370., 24., 26.]})
>>> df
   Animal  Max Speed
0  Falcon      380.0
1  Falcon      370.0
2  Parrot       24.0
3  Parrot       26.0
>>> df.groupby(['Animal']).mean()
        Max Speed
Animal
Falcon      375.0
Parrot       25.0

pd.iloc[], pd.loc[]

Os comandos iloc e loc são os parceiros de navegação para acessar linhas e colunas da sua base de dados. Em iloc você consegui acessar colunas e linhas através de rótulos numéricos, já com loc você utiliza rótulos como string. Em cada um deles é possível utilizar slices e condicionais para enriquercer o acesso as informações, sem dúvida é um comando indispensável diariamente.

>>> df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])
>>> df
            max_speed  shield
cobra               1       2
viper               4       5
sidewinder          7       8

>>> df.loc['viper']
max_speed    4
shield       5

>>> df.iloc[0]
max_speed    1
shield       2

pd.at[]

Pra quem já utilizou o iloc e loc sabe que o resultado gerado pelo pandas é uma view apresentada ao usuário que representa os dados do dataframe. Quem ja tentou alterar alguns dados com iloc e loc provavelmente já se sentiu frustrado. Para alterar valores mediante consultas de acesso o pandas tem o método pd.at(), tive que vasculhar bem o stackOverflow a procura dessa resposta quando começei a usar pandas.

>>> df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]],
                  index=[4, 5, 6], columns=['A', 'B', 'C'])
>>> df
    A   B   C
4   0   2   3
5   0   4   1
6  10  20  30

>>> df.at[4, 'B']
2

>>> df.at[4, 'B'] = 10
>>> df.at[4, 'B']
10

>>>df.loc[5].at['B']
4

pd.sort_values()

O próprio nome já é bem intuitivo, hora de ordenar valores em colunas. Descobri mais tarde que havia como você alterar o tipo de ordenação que ele utilizaria, e.g.: quicksort, insertionsort, etc… Bem prático não é mesmo?

>>> df = pd.DataFrame({
    'col1': ['A', 'A', 'B', np.nan, 'D', 'C'],
    'col2': [2, 1, 9, 8, 7, 4],
    'col3': [0, 1, 9, 4, 2, 3],
    'col4': ['a', 'B', 'c', 'D', 'e', 'F']
})
>>> df
  col1  col2  col3 col4
0    A     2     0    a
1    A     1     1    B
2    B     9     9    c
3  NaN     8     4    D
4    D     7     2    e
5    C     4     3    F

>>> df.sort_values(by=['col1'])
  col1  col2  col3 col4
0    A     2     0    a
1    A     1     1    B
2    B     9     9    c
5    C     4     3    F
4    D     7     2    e
3  NaN     8     4    D

pd.apply()

O comando apply aplica funções a colunas e linhas do Dataframe. Bem prático quando se desejar construir uma função e para cada linha de um coluna você deseja que seja aplicada essa função, o apply fará isso pra você, sem que você tenha que construir laços de repetição, programação funcional é sempre uma boa.

>>> df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
>>> df
   A  B
0  4  9
1  4  9
2  4  9

>>> df.apply(np.sqrt)
     A    B
0  2.0  3.0
1  2.0  3.0
2  2.0  3.0

>>> df.apply(np.sum, axis=0)
A    12
B    27
dtype: int64

pd.value_counts()

Esse comando eu uso constantemente, seja para uma rápida análise na coluna ou para consultar amostras para modelos de Machine Learning. Com o value_counts é possível contar rapidamente quantos atributos a coluna do dataframe tem, de forma bem rápida e direta.

>>> df = pd.DataFrame({'num_legs': [2, 4, 4, 6],
                   'num_wings': [2, 0, 0, 0]},
                  index=['falcon', 'dog', 'cat', 'ant'])
>>> df
        num_legs  num_wings
falcon         2          2
dog            4          0
cat            4          0
ant            6          0

>>> df.value_counts()
num_legs  num_wings
4         0            2
6         0            1
2         2            1

pd.concat()

Me tirou do prego várias vezes. O concat te permite unir dois dataframes do mesmo shape encaixando-o de forma vertical.

>>> s1 = pd.Series(['a', 'b'])
>>> s2 = pd.Series(['c', 'd'])
pd.concat([s1, s2])
0    a
1    b
0    c
1    d

>>> pd.concat([s1, s2], ignore_index=True)
0    a
1    b
2    c
3    d

pd.itertuples()

No início eu utiliza muito o iterrows() para acessar itens de uam Série pandas ou Dataframe, porém, descobrir no StackOverflow através de um discussão de fórum que o método iterrows é mais lento do que o itertuples(). Não entrarei em detalhes agora sobre o desempenho e cada um, mas após utilizar o itertuples ganhei um desempenho absurdo, ainda mais em base de dados com matrizes esparsas.

>>> df = pd.DataFrame({'num_legs': [4, 2], 'num_wings': [0, 2]},
                  index=['dog', 'hawk'])
>>> df
      num_legs  num_wings
dog          4          0
hawk         2          2

>>>for row in df.itertuples():
    print(row)

Pandas(Index='dog', num_legs=4, num_wings=0)
Pandas(Index='hawk', num_legs=2, num_wings=2)

Conclusão!

  • • Esse foram os comandos que usei e uso diariamente, diria até que são os comandos coringas, que voce cedo ou tarde quando estiver fazendo análise com pandas irá utilizá-lo.

  • • A maioria dos exemplos citados aqui foram retirados da própria documentação do Pandas, que por sinal está cheia de exemplos. Eu particularmente adoro documentações ricas em exemplos e de fácil acesso.

  • • Se tiver alguma dúvida de como fazer alguma operação, não deixe de consultar os fóruns de discussão. Eu aprendi muito lendo fóruns como StackOverflow e demais.

Obrigado por ler! Algum comentário ou feedback? Me mande uma mensagem na página de contato. Você pode me encontrar no LinkedIn.