Aprenda Pandas

  • Página Inicial
  • Contato!
  • Tudo sobre Pandas Parte 1!
  • Tudo sobre Pandas Parte 2!
  • Tudo sobre Pandas Parte 1

    Dataframe

    Vamos começar criando um novo projeto em Python e instalando as bibliotecas pra pandas e jupyter.

    Pra começar, faça assim:

    
    import pandas as pd
    
    df = pd.DataFrame()
    
    print(df)
    
    

    O dataframe é uma maneira que temos de armazenar os dados, como um banco mesmo. Por ser uma classe, ele tem vários atributos e métodos.

    PS: Apesar de trabalharmos com Python, o back-end do Pandas é escrito em C.

    Para passarmos os dados, podemos fazer assim:

    
    import pandas as pd
    
    df = pd.DataFrame(((1, "Jorge", 0.4), (177, 8, ("João"))))
    
    print(df)
    
    

    Como observado, podemos armazenar vários tipo de conteúdos, como string, int e float.

    Pra exibir as colunas e índices, fazemos assim:

    
    print(df.columns)
    print(df.index)
    
    

    Podemos mudar os nomes dos índices, assim:

    
    import pandas as pd
    
    df = pd.DataFrame(((1, "Jorge", 0.4), (177, 8, ("João"))), index = (45, "Maria"))
    
    print(df)
    
    

    E das colunas também:

    
    df = pd.DataFrame(((1, "Jorge", 0.4), (177, 8, ("João"))), index = (45, "Maria"), columns = ("Brasil", "US", "Laranja"))
    
    

    E pra ver o tamanho dos índices e colunas:

    
    print(df.shape)
    
    

    E pra ver os tipos das variáveis das colunas:

    
    print(df.dtypes)
    
    

    Base de Dados

    Vamos pegar esse repositório como exemplo pras próximas lições: https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv

    E deixe o código assim:

    
    import pandas as pd
    
    # Base de dados - Covid global
    link = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
    
    dfNotif = pd.read_csv(link)
    
    print(dfNotif)
    
    

    Podemos fazer o mesmo com esse link aqui:

    
    link = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/refs/heads/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"
    
    dfNotif = pd.read_csv(link)
    
    print(dfNotif)
    
    

    Comando Drop

    Podemos remover alguns campos dos dados recebidos pelo Pandas, como no caso acima, a latitude e longitude, que não são necessários no momento. Podemos filtrar assim:

    
    print(dfNotif.drop(["Lat", "Long"], axis = 1))
    
    

    PS: Isso não altera o dataframe original, apenas exibe sem as colunas especificadas. Para criar uma nova atribuição, faça assim:

    
    dfNotif = dfNotif.drop(["Lat", "Long"], axis = 1)
    
    

    Ou, de forma mais inteligente, assim:

    
    dfNotif.drop(["Lat", "Long"], axis = 1, inplace = True)
    
    

    Comando Loc

    Para localizar determinadas coisas dentro de um dataframe, podemos usar o comando loc, veja como encontramos o índice 0 de um dataframe:

    
    print(dfNotif.loc[0])
    
    

    Pra filtrar por uma coluna, fazemos assim:

    
    print(dfNotif.loc[0, "Country/Region"])
    
    

    Podemos pegar a coluna por número também, apenas trocando loc por iloc, assim:

    
    print(dfNotif.iloc[0, 1])
    
    

    Pra pegar todas as ocorrências, mas filtrando apenas por uma coluna:

    
    print(dfNotif.loc[:, "Country/Region"])
    
    

    Pra pegar determinadas linhas e colunas:

    
    print(dfNotif.loc[(54, 66, 87), ("Country/Region", "12/14/21")])
    
    

    Com mais uma coluna:

    
    print(dfNotif.loc[(54, 66, 87), ("Province/State", "Country/Region", "12/14/21")])
    
    

    Pra pegar um intervalo de ocorrências:

    
    print(dfNotif.loc[54:66, ("Province/State", "Country/Region", "12/14/21")])
    
    

    Podemos mostrar o objeto com um fatiamento de lista, como por exemplo, exibindo apenas dados de uma só coluna:

    
    print(dfNotif["Country/Region"])
    print(dfNotif.loc[:, "Country/Region"]) # Basicamente faz a mesma coisa do print acima
    
    

    Podemos filtrar as colunas assim também:

    
    print(dfNotif[["Province/State", "Country/Region", "12/14/21"]])
    
    

    Podemos verificar conteúdos assim:

    
    print(dfNotif["Country/Region"] == "Brazil")
    
    

    E podemos fazer assim também:

    
    print(dfNotif.loc[dfNotif["Country/Region"] == "Brazil"])
    
    

    Da mesma forma:

    
    print(dfNotif["Country/Region"] == "US")
    
    

    E pra escolhe entre um ou outro:

    
    print(dfNotif.loc[(dfNotif["Country/Region"] == "Brazil") | (dfNotif["Country/Region"] == "US")])
    
    

    O Pandas não utiliza os mesmos operadores lógicos do Python, como o and e or literais. E sim esses aqui:

    Operador Operação
    & AND
    | OR
    ~ NOT

    Lembrando que as condições devem usar parênteses, como exemplificado acima.

    Podemos fazer essa filtragem:

    
    print(dfNotif.loc[dfNotif["12/24/21"] < 1e06]) # Experimente trocar o "<" pelo ">", o 1e06 significa 1 milhão
    
    

    Comando Isna

    Podemos também filtrar os dados, de forma que não pegue dados faltantes.

    Como a base de dados é muito grande, podemos usar o método isna pra ver se o dataframe tem dados considerados NaN (not a number):

    
    print(dfNotif.isna())
    
    

    E pra ver se tem algo em uma linha considerado falso:

    
    print(dfNotif.isna().any(axis = 0))
    
    

    Pra pegar todas as linhas e as colunas que obedeçam à condição especificada:

    
    print(dfNotif.loc[:, dfNotif.isna().any(axis = 0)])
    
    

    E pra transformar os dados em booleanos e somar os dados true:

    
    print(dfNotif.loc[:, dfNotif.isna().any(axis = 0)].isna().sum())
    
    

    E para ver a quantidade de dados faltantes:

    
    print(100 * dfNotif.loc[:, dfNotif.isna().any(axis = 0)].isna().sum() / dfNotif.shape[0])
    
    

    Comando sort_values

    Podemos também organizar nossos registros no dataframe.

    Para pegar o último registro da nossa base de dados, fazemos assim:

    
    print(dfNotif.columns[-1])
    
    

    E pra ordenar de forma reversa:

    
    lastDay = dfNotif.columns[-1]
    
    print(dfNotif.sort_values(by = lastDay, ascending = False))
    
    

    E pra ler somente 10 registros:

    
    print(dfNotif.sort_values(by = lastDay, ascending = False).head(10))
    
    

    Comando Group By

    Esse comando serve pra agrupar os registros na base de dados usando uma coluna de referência. Veja um exemplo:

    
    print(dfNotif.groupby(by = ["Country/Region"]))
    
    

    Só que isso mostrará apenas a chamada do objeto, para mostrar os registros, devemos fazer assim, com uma operação:

    
    print(dfNotif.groupby(by = ["Country/Region"]).sum())
    
    

    Nesse caso, as colunas repetidas não aparecem, como a Province/State, até porque ele não soma strings (NaN é considerada uma string, no caso).

    Comando Stack

    O comando stack reorganiza (ou empilha) as colunas de um DataFrame dentro do índice das linhas, criando uma estrutura mais compacta. Veja um exemplo simples de uso:

    
    dfNotif.drop(["Province/State", "Lat", "Long"], axis = 1, inplace = True)
    
    dfNotif = dfNotif.groupby(by = ["Country/Region"]).sum()
    
    print(dfNotif.stack())
    
    

    Pra salvar o empilhamento (não apague nada além dos prints anteriores):

    
    dfNotif = dfNotif.stack()
    
    print(dfNotif)
    
    

    Pra colocar nomes personalizados nas colunas (não apague nada além dos prints anteriores):

    
    dfNotif = dfNotif.stack()
    
    dfNotif.index.set_names(("País/Região", "Datas"), inplace = True)
    
    print(dfNotif)
    
    

    E pra colocar um nome para o frame (mesma regra, só apague os prints anteriores):

    
    dfNotif = dfNotif.stack()
    
    dfNotif.index.set_names(("País/Região", "Datas"), inplace = True)
    
    dfNotif = dfNotif.to_frame(name = "Notificações")
    
    print(dfNotif)