Minha cábula por pandas

Um professor me disse uma vez que, se você procurar um análogo de um programador no mundo dos livros, os programadores não são como livros, mas um sumário: eles não se lembram de tudo, mas sabem como encontrar rapidamente o que precisam.

A capacidade de encontrar rapidamente descrições de funções permite que os programadores trabalhem produtivamente sem perder o estado do fluxo. Por isso, criei a folha de dicas aqui apresentada pandase incluí nela o que uso todos os dias, criando aplicativos da Web e modelos de aprendizado de máquina. Esta não é uma lista exaustiva de recursos , mas inclui as funções que eu uso com mais freqüência, exemplos e minhas explicações sobre situações em que essas funções são especialmente úteis.



pandas

1. Preparação para o trabalho


Se você quiser testar independentemente o que será discutido aqui, faça o download do conjunto de dados do Anime Recommendations Database no Kaggle. Descompacte-o e coloque-o na mesma pasta em que o seu Jupyter Notebook está localizado (a seguir - bloco de notas).

Agora execute os seguintes comandos.

import pandas as pd
import numpy as np
anime = pd.read_csv('anime-recommendations-database/anime.csv')
rating = pd.read_csv('anime-recommendations-database/rating.csv')
anime_modified = anime.set_index('name')

Depois disso, você poderá reproduzir o que mostrarei nas seções seguintes deste material.

2. Importar dados


▍ Baixar dados CSV


Aqui, quero falar sobre a conversão de dados CSV diretamente em quadros de dados (em quadros de dados). Às vezes, ao baixar dados no formato CSV, é necessário especificar a codificação (por exemplo, pode parecer encoding='ISO-8859–1'). Essa é a primeira coisa que você deve tentar fazer se verificar que, após carregar os dados, o quadro de dados contenha caracteres ilegíveis.

anime = pd.read_csv('anime-recommendations-database/anime.csv')


Dados baixados de CSV

Há uma função semelhante para carregar dados de arquivos do Excelpd.read_excel.

Criar um quadro de dados a partir de dados inseridos manualmente


Isso pode ser útil quando você precisar inserir manualmente dados simples no programa. Por exemplo, se você precisar avaliar as alterações submetidas a dados que passam pelo pipeline de processamento de dados.

df = pd.DataFrame([[1,'Bob', 'Builder'],
                  [2,'Sally', 'Baker'],
                  [3,'Scott', 'Candle Stick Maker']], 
columns=['id','name', 'occupation'])


Entrada manual

▍ Copiando um quadro de dados


A cópia de quadros de dados pode ser útil em situações nas quais você precisa fazer alterações nesses dados, mas também precisa salvar o original. Se os quadros de dados precisarem ser copiados, é recomendável fazer isso imediatamente após o download.

anime_copy = anime.copy(deep=True)


Cópia do quadro de dados

3. Exportação de dados


▍ Exportar para o formato CSV


Ao exportar dados, eles são salvos na mesma pasta que o bloco de notas. Abaixo está um exemplo de salvar as 10 primeiras linhas de um quadro de dados, mas o que exatamente salvar depende da tarefa específica.

rating[:10].to_csv('saved_ratings.csv', index=False)

Você pode exportar dados como arquivos do Excel usando a função df.to_excel.

4. Visualizar e pesquisar dados


Et Obtendo n registros do início ou do fim do quadro de dados


Primeiro, nvamos falar sobre a saída dos primeiros elementos do quadro de dados. Costumo inferir vários elementos desde o início de um quadro de dados em algum lugar de um caderno. Isso me permite acessar convenientemente esses dados caso eu esqueça o que exatamente está no quadro de dados. A conclusão dos últimos elementos desempenha um papel semelhante.

anime.head(3)
rating.tail(1)


Dados desde o início do quadro de dados


Dados do final do quadro de dados

▍ Contando o número de linhas em um quadro de dados


A função len(),que mostrarei aqui não está incluída pandas. Mas é adequado para contar o número de linhas de quadros de dados. Os resultados de seu trabalho podem ser armazenados em uma variável e usados ​​onde forem necessários.

len(df)
#=> 3

▍Contando o número de valores exclusivos em uma coluna


Para calcular o número de valores exclusivos em uma coluna, você pode usar esta construção:

len(ratings['user_id'].unique())

Obtendo informações do quadro de dados


As informações sobre o quadro de dados incluem informações gerais sobre ele, como o cabeçalho, o número de valores, os tipos de dados das colunas.

anime.info()


Informações do quadro de dados

Há outra função semelhante adf.info-df.dtypes. Ele exibe apenas informações sobre os tipos de dados das colunas.

StatisticsExibindo estatísticas sobre o quadro de dados


Conhecer as informações estatísticas sobre o quadro de dados é muito útil em situações em que contém muitos valores numéricos. Por exemplo, conhecer os valores médio, mínimo e máximo de uma coluna ratingnos fornece algumas dicas sobre a aparência do quadro de dados como um todo. Aqui está o comando correspondente:

anime.describe()


Estatísticas do quadro de dados

CalculationCálculo da conta


Para calcular o número de valores em uma coluna específica, você pode usar a seguinte construção:

anime.type.value_counts()


Contar o número de itens em uma coluna

5. Extraindo informações de quadros de dados


Criando uma lista ou objeto de série com base nos valores da coluna


Isso pode ser útil nos casos em que você deseja extrair os valores das colunas em variáveis xe ypara treinar o modelo. Os seguintes comandos se aplicam aqui:

anime['genre'].tolist()
anime['genre']


Os resultados do comando anime ['genre']. Tolist ()


Resultados da Equipe Anime ['gênero']

Obtendo uma lista de valores de um índice


Vamos falar sobre como obter listas de valores de um índice. Observe que usei o quadro de dados aqui anime_modified, pois seus valores de índice parecem mais interessantes.

anime_modified.index.tolist()


Resultados da Equipa

Et Obtendo uma lista de valores de coluna


Aqui está um comando que permite obter uma lista dos valores da coluna:

anime.columns.tolist()


Resultados da Equipa

6. Adicionando dados ao quadro de dados e removendo-os dele


▍Conectando uma nova coluna com um valor especificado ao quadro de dados


Às vezes, tenho que adicionar novas colunas aos quadros de dados. Por exemplo - nos casos em que tenho conjuntos de teste e treinamento em dois quadros de dados diferentes, e antes de combiná-los, preciso marcá-los para que possam ser distinguidos mais tarde. Para isso, é utilizada a seguinte construção:

anime['train set'] = True

Crie um novo quadro de dados a partir de um subconjunto de colunas


Isso pode ser útil se você deseja salvar várias colunas de um grande quadro de dados no novo quadro de dados, mas não deseja anotar os nomes das colunas que deseja excluir.

anime[['name','episodes']]


Resultado do Comando

▍ Excluir colunas especificadas


Essa técnica pode ser útil se você precisar remover apenas algumas colunas do quadro de dados. Se você precisar excluir muitas colunas, essa tarefa poderá ser bastante entediante, então aqui prefiro usar a oportunidade descrita na seção anterior.

anime.drop(['anime_id', 'genre', 'members'], axis=1).head()


Resultados da Equipa

DingAdicionando uma linha com a soma dos valores de outras linhas ao quadro de dados


Para demonstrar esse exemplo, criaremos independentemente um pequeno quadro de dados conveniente para trabalhar. O mais interessante aqui é o design df.sum(axis=0), que permite obter a soma dos valores de diferentes linhas. 

df = pd.DataFrame([[1,'Bob', 8000],
                  [2,'Sally', 9000],
                  [3,'Scott', 20]], columns=['id','name', 'power level'])
df.append(df.sum(axis=0), ignore_index=True)


O resultado do comando

O comando da visualizaçãodf.sum(axis=1)permite somar os valores nas colunas.

Um mecanismo semelhante também é aplicável para o cálculo de valores médios. Por exemplo -df.mean(axis=0).

7. Combinando quadros de dados


▍ Concatenação de dois quadros de dados


Essa técnica é aplicável em situações em que há dois quadros de dados com as mesmas colunas que precisam ser combinados.

Neste exemplo, primeiro dividimos o quadro de dados em duas partes e depois as combinamos novamente:

df1 = anime[0:2]
df2 = anime[2:4]
pd.concat([df1, df2], ignore_index=True)


Dataframe df1


Datframe df2


Dataframe combinando df1 e df2

▍ Mesclar quadros de dados


A função df.mergeque veremos aqui é semelhante à junção SQL esquerda. É usado quando dois quadros de dados precisam ser combinados em uma determinada coluna.

rating.merge(anime, left_on=’anime_id’, right_on=’anime_id’, suffixes=(‘_left’, ‘_right’))


Resultados da Equipa

8. Filtragem


Obtendo linhas com os valores de índice desejados


Os valores de índice do quadro de dados anime_modifiedsão os nomes do anime. Observe como usamos esses nomes para selecionar colunas específicas.

anime_modified.loc[['Haikyuu!! Second Season','Gintama']]


Resultados da Equipa

Et Obtendo strings por índices numéricos


Essa técnica é diferente da descrita na seção anterior. Ao usar a função, a df.ilocprimeira linha recebe um índice 0, a segunda é um índice 1e assim por diante. Esses índices são atribuídos às linhas, mesmo que o quadro de dados tenha sido modificado e os valores de sequência sejam usados ​​em sua coluna de índice.

A construção a seguir permite selecionar as três primeiras linhas do quadro de dados:

anime_modified.iloc[0:3]


Resultados da Equipa

Obtendo linhas por valores de coluna fornecidos


Para obter linhas de um quadro de dados em uma situação em que há uma lista de valores de coluna, você pode usar o seguinte comando:

anime[anime['type'].isin(['TV', 'Movie'])]


Os resultados do comando

Se estamos interessados ​​em um único significado - você pode usar este design:

anime[anime[‘type’] == 'TV']

Et Obtendo uma fatia do quadro de dados


Essa técnica é semelhante a obter uma fatia de uma lista. Ou seja, estamos falando em obter um fragmento de um quadro de dados contendo linhas correspondentes a uma determinada configuração de índice.

anime[1:3]


Resultados da Equipa

▍ Filtrando por valor


Nos quadros de dados, você pode selecionar as linhas que correspondem à condição especificada. Observe que o uso desse método preserva os valores de índice existentes.

anime[anime['rating'] > 8]


Resultados da Equipa

9. Classificar


Para classificar os quadros de dados por valores da coluna, você pode usar a função df.sort_values:

anime.sort_values('rating', ascending=False)


Resultados da Equipa

10. Agregação


Função fDf.groupby e contando o número de registros


Veja como contar o número de registros com diferentes valores nas colunas:

anime.groupby('type').count()


Resultados da Equipa

Function Função df.groupby e agregação de colunas de várias maneiras


Preste atenção ao que é usado aqui reset_index(). Caso contrário, a coluna typese tornará uma coluna de índice. Na maioria dos casos, eu recomendo fazer o mesmo.

anime.groupby(["type"]).agg({
  "rating": "sum",
  "episodes": "count",
  "name": "last"
}).reset_index()

ReaCriar uma tabela dinâmica


Para extrair alguns dados do quadro de dados, não há nada melhor do que uma tabela dinâmica. Observe que aqui filtramos seriamente o quadro de dados, o que acelerou a criação da tabela dinâmica.

tmp_df = rating.copy()
tmp_df.sort_values('user_id', ascending=True, inplace=True)
tmp_df = tmp_df[tmp_df.user_id < 10
tmp_df = tmp_df[tmp_df.anime_id < 30]
tmp_df = tmp_df[tmp_df.rating != -1]
pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum, fill_value=0)


Resultados da Equipa

11. Limpeza de dados


▍ Grave em células que contenham o valor NaN de algum outro valor


Aqui falamos sobre escrever valores 0em células que contêm o valor NaN. Neste exemplo, criamos a mesma tabela dinâmica de antes, mas sem uso fill_value=0. E, em seguida, use a função fillna(0)para substituir os valores NaNpor 0.

pivot = pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum)
pivot.fillna(0)


Tabela contendo valores de NaN


Resultados da substituição dos valores de NaN por 0

12. Outros recursos úteis


▍ Amostragem de amostras aleatórias de um conjunto de dados


Uso a função df.sampletoda vez que preciso obter um pequeno conjunto aleatório de linhas de um grande quadro de dados. Se um parâmetro for usado frac=1, a função permitirá obter um analógico do quadro de dados original, cujas linhas serão misturadas.

anime.sample(frac=0.25)


Resultados da Equipa

▍ Selecionando linhas do quadro de dados


A construção a seguir permite iterar nas linhas de um quadro de dados:

for idx,row in anime[:2].iterrows():
    print(idx, row)


Resultados da Equipa

Rate A taxa de dados do IOPub de combate excedeu o erro


Se você encontrar um erro IOPub data rate exceeded, tente usar o seguinte comando ao iniciar o Jupyter Notebook:

jupyter notebook — NotebookApp.iopub_data_rate_limit=1.0e10

Sumário


Aqui eu falei sobre alguns pandastruques úteis para usar o ambiente Jupyter Notebook. Espero que minha folha de dicas seja útil.

Queridos leitores! Existem oportunidades pandassem as quais você não pode imaginar seu trabalho diário?


All Articles