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 pandas
e 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 CSVHá 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 dados3. 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, n
vamos 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 dadosDados 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)
▍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 dadosHá 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 rating
nos 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 dadosCalculationCá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 coluna5. 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 x
e y
para 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 EquipaEt 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 Equipa6. 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 EquipaDingAdicionando 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 comandoO 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 df1Datframe df2Dataframe combinando df1 e df2▍ Mesclar quadros de dados
A função df.merge
que 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 Equipa8. Filtragem
Obtendo linhas com os valores de índice desejados
Os valores de índice do quadro de dados anime_modified
são os nomes do anime. Observe como usamos esses nomes para selecionar colunas específicas.anime_modified.loc[['Haikyuu!! Second Season','Gintama']]
Resultados da EquipaEt Obtendo strings por índices numéricos
Essa técnica é diferente da descrita na seção anterior. Ao usar a função, a df.iloc
primeira linha recebe um índice 0
, a segunda é um índice 1
e 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 EquipaObtendo 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 comandoSe 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 Equipa9. 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 Equipa10. 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 EquipaFunction 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 type
se 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 Equipa11. Limpeza de dados
▍ Grave em células que contenham o valor NaN de algum outro valor
Aqui falamos sobre escrever valores 0
em 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 NaN
por 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 NaNResultados da substituição dos valores de NaN por 012. Outros recursos úteis
▍ Amostragem de amostras aleatórias de um conjunto de dados
Uso a função df.sample
toda 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 EquipaRate 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 pandas
truques úteis para usar o ambiente Jupyter Notebook. Espero que minha folha de dicas seja útil.Queridos leitores! Existem oportunidades pandas
sem as quais você não pode imaginar seu trabalho diário?