Ma feuille de triche par pandas

Un enseignant m'a dit un jour que si vous cherchez un analogue d'un programmeur dans le monde du livre, il s'avère que les programmeurs ne sont pas comme des manuels, mais plutôt une table des matières: ils ne se souviennent pas de tout, mais ils savent trouver rapidement ce dont ils ont besoin.

La possibilité de trouver rapidement des descriptions de fonctions permet aux programmeurs de travailler de manière productive sans perdre l'état du flux. C'est pourquoi j'ai créé la feuille de triche présentée ici pandaset y ai inclus ce que j'utilise tous les jours, créant des applications Web et des modèles d'apprentissage automatique. Il ne s'agit pas d'une liste exhaustive de fonctionnalités , mais elle comprend les fonctions que j'utilise le plus souvent, des exemples et mes explications sur les situations dans lesquelles ces fonctions sont particulièrement utiles.



pandas

1. Préparation au travail


Si vous souhaitez tester indépendamment ce qui va être discuté ici, téléchargez le jeu de données Anime Recommendations Database depuis Kaggle. Décompressez-le et placez-le dans le même dossier où se trouve votre bloc-notes Jupyter (ci-après - le bloc-notes).

Exécutez maintenant les commandes suivantes.

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')

Après cela, vous devriez pouvoir reproduire ce que je montrerai dans les sections suivantes de ce matériel.

2. Importer des données


▍ Télécharger les données CSV


Ici, je veux parler de la conversion des données CSV directement en trames de données (en Dataframes). Parfois, lors du téléchargement de données au format CSV, vous devez spécifier leur encodage (par exemple, il peut ressembler encoding='ISO-8859–1'). C'est la première chose que vous devriez essayer de faire s'il s'avère qu'après le chargement des données, le bloc de données contient des caractères illisibles.

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


Données CSV téléchargées

Il existe une fonction similaire pour charger des données à partir de fichiers Excelpd.read_excel.

▍Créer un bloc de données à partir de données saisies manuellement


Cela peut être utile lorsque vous devez saisir manuellement des données simples dans le programme. Par exemple, si vous devez évaluer les modifications subissant des données passant par le pipeline de traitement des données.

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


Saisie manuelle

▍ Copie d'une trame de données


La copie de trames de données peut être utile dans les situations où vous devez apporter des modifications à ces données, mais vous devez également enregistrer l'original. Si des trames de données doivent être copiées, il est recommandé de le faire immédiatement après leur téléchargement.

anime_copy = anime.copy(deep=True)


Copie du bloc de données

3. Exportation de données


▍ Exporter au format CSV


Lors de l'exportation des données, elles sont enregistrées dans le même dossier que le bloc-notes. Vous trouverez ci-dessous un exemple d'enregistrement des 10 premières lignes d'un bloc de données, mais ce qui doit être enregistré exactement dépend de la tâche spécifique.

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

Vous pouvez exporter des données sous forme de fichiers Excel à l'aide de la fonction df.to_excel.

4. Afficher et rechercher des données


▍ Obtention de n enregistrements depuis le début ou la fin de la trame de données


Parlons d'abord de la sortie des premiers néléments de la trame de données. J'infère souvent un certain nombre d'éléments depuis le début d'une trame de données quelque part dans un cahier. Cela me permet d'accéder facilement à ces données au cas où j'oublierais ce qui se trouve exactement dans le bloc de données. La conclusion des derniers éléments joue un rôle similaire.

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


Données du début de la trame de données


Données de la fin de la trame de données

▍ Compter le nombre de lignes dans un bloc de données


La fonction len(),que je vais montrer ici n'est pas incluse pandas. Mais il est bien adapté pour compter le nombre de lignes de trames de données. Les résultats de son travail peuvent être stockés dans une variable et utilisés là où ils sont nécessaires.

len(df)
#=> 3

▍Comptage du nombre de valeurs uniques dans une colonne


Pour calculer le nombre de valeurs uniques dans une colonne, vous pouvez utiliser cette construction:

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

▍ Obtention d'informations sur le bloc de données


Les informations sur le bloc de données comprennent des informations générales à ce sujet, telles que l'en-tête, le nombre de valeurs, les types de données des colonnes.

anime.info()


Informations sur la trame de données

Il existe une autre fonction similaire àdf.info-df.dtypes. Il affiche uniquement des informations sur les types de données des colonnes.

▍Affichage des statistiques sur la trame de données


La connaissance des informations statistiques sur la trame de données est très utile dans les situations où elle contient beaucoup de valeurs numériques. Par exemple, connaître les valeurs moyennes, minimales et maximales d'une colonne ratingnous donne un aperçu de l'apparence du bloc de données dans son ensemble. Voici la commande correspondante:

anime.describe()


Statistiques de trame de données

▍Compte des calculs


Afin de calculer le nombre de valeurs dans une colonne particulière, vous pouvez utiliser la construction suivante:

anime.type.value_counts()


Compter le nombre d'éléments dans une colonne

5. Extraire des informations des trames de données


▍Création d'un objet liste ou série basé sur des valeurs de colonne


Cela peut être utile dans les cas où vous souhaitez extraire les valeurs des colonnes en variables xet ypour entraîner le modèle. Les commandes suivantes s'appliquent ici:

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


Les résultats de la commande anime ['genre']. Tolist ()


Anime ['genre'] Résultats de l'équipe

▍Obtenir une liste de valeurs à partir d'un index


Parlons de l'obtention de listes de valeurs à partir d'un index. Veuillez noter que j'ai utilisé le bloc de données ici anime_modified, car ses valeurs d'index semblent plus intéressantes.

anime_modified.index.tolist()


Résultats d'équipe

▍Obtenir une liste de valeurs de colonne


Voici une commande qui vous permet d'obtenir une liste de valeurs de colonne:

anime.columns.tolist()


Résultats d'équipe

6. Ajout et suppression de données dans le bloc de données


▍Connexion d'une nouvelle colonne avec une valeur spécifiée au bloc de données


Parfois, je dois ajouter de nouvelles colonnes aux cadres de données. Par exemple, dans les cas où j'ai des ensembles de test et de formation dans deux trames de données différentes, et avant de les combiner, je dois les marquer afin de pouvoir les distinguer plus tard. Pour cela, la construction suivante est utilisée:

anime['train set'] = True

▍Créez un nouveau bloc de données à partir d'un sous-ensemble de colonnes


Cela peut être utile si vous souhaitez enregistrer plusieurs colonnes d'un bloc de données volumineux dans le nouveau bloc de données, mais que vous ne souhaitez pas noter les noms des colonnes que vous souhaitez supprimer.

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


Résultat de la commande

▍ Supprimer les colonnes spécifiées


Cette technique peut être utile si vous devez supprimer seulement quelques colonnes du bloc de données. Si vous devez supprimer de nombreuses colonnes, cette tâche peut être assez fastidieuse, donc ici je préfère utiliser l'opportunité décrite dans la section précédente.

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


Résultats d'équipe

▍Ajout d'une ligne avec la somme des valeurs des autres lignes au bloc de données


Pour illustrer cet exemple, nous allons créer indépendamment un petit bloc de données avec lequel il est pratique de travailler. La chose la plus intéressante ici est la conception df.sum(axis=0), qui vous permet d'obtenir la somme des valeurs de différentes lignes. 

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)


Le résultat de la commande

La commande de la vuedf.sum(axis=1)vous permet de additionner les valeurs dans les colonnes.

Un mécanisme similaire est également applicable pour le calcul des valeurs moyennes. Par exemple -df.mean(axis=0).

7. Combinaison de trames de données


▍ Concaténation de deux trames de données


Cette technique est applicable dans les situations où il y a deux trames de données avec les mêmes colonnes qui doivent être combinées.

Dans cet exemple, nous divisons d'abord le bloc de données en deux parties, puis combinons à nouveau ces parties:

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


Dataframe df1


Datframe df2


Trame de données combinant df1 et df2

▍ Fusionner les trames de données


La fonction df.mergeque nous verrons ici est similaire à la jointure SQL gauche. Il est utilisé lorsque deux trames de données doivent être combinées dans une certaine colonne.

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


Résultats d'équipe

8. Filtrage


▍Obtenir des lignes avec les valeurs d'index souhaitées


Les valeurs d'index de la trame de données anime_modifiedsont les noms de l'anime. Remarquez comment nous utilisons ces noms pour sélectionner des colonnes spécifiques.

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


Résultats d'équipe

▍Obtenir des chaînes par des indices numériques


Cette technique est différente de celle décrite dans la section précédente. Lorsque vous utilisez la fonction, la df.ilocpremière ligne se voit attribuer un index 0, la seconde est un index 1, etc. De tels index sont attribués aux lignes même si le bloc de données a été modifié et que des valeurs de chaîne sont utilisées dans sa colonne d'index.

La construction suivante vous permet de sélectionner les trois premières lignes du bloc de données:

anime_modified.iloc[0:3]


Résultats d'équipe

EttingObtenir des lignes par des valeurs de colonne données


Pour obtenir des lignes d'un bloc de données dans une situation où il existe une liste de valeurs de colonne, vous pouvez utiliser la commande suivante:

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


Les résultats de la commande

Si nous sommes intéressés par une seule signification - vous pouvez utiliser cette conception:

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

▍Obtenir une tranche de trame de données


Cette technique est similaire à l'obtention d'une tranche d'une liste. À savoir, nous parlons d'obtenir un fragment d'une trame de données contenant des lignes correspondant à une configuration d'index donnée.

anime[1:3]


Résultats d'équipe

▍ Filtrage par valeur


À partir des trames de données, vous pouvez sélectionner les lignes qui correspondent à la condition spécifiée. Veuillez noter que l'utilisation de cette méthode préserve les valeurs d'index existantes.

anime[anime['rating'] > 8]


Résultats d'équipe

9. Trier


Pour trier les blocs de données par valeur de colonne, vous pouvez utiliser la fonction df.sort_values:

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


Résultats d'équipe

10. Agrégation


Fonction fDf.groupby et comptage du nombre d'enregistrements


Voici comment compter le nombre d'enregistrements avec des valeurs différentes dans les colonnes:

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


Résultats d'équipe

▍ Fonction df.groupby et agrégation de colonnes de différentes manières


Faites attention à ce qui est utilisé ici reset_index(). Sinon, la colonne typedevient une colonne d'index. Dans la plupart des cas, je recommande de faire de même.

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

▍Créer un tableau croisé dynamique


Pour extraire certaines données du bloc de données, rien de mieux qu'un tableau croisé dynamique. Veuillez noter qu'ici, j'ai sérieusement filtré le bloc de données, ce qui a accéléré la création du tableau croisé dynamique.

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)


Résultats d'équipe

11. Nettoyage des données


▍ Écrire dans des cellules contenant la valeur NaN d'une autre valeur


Ici, nous parlons d'écrire des valeurs 0dans des cellules contenant la valeur NaN. Dans cet exemple, nous créons le même tableau croisé dynamique qu'avant, mais sans utilisation fill_value=0. Et puis utilisez la fonction fillna(0)pour remplacer les valeurs NaNpar 0.

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


Tableau contenant les valeurs NaN


Résultats du remplacement des valeurs de NaN par 0

12. Autres fonctionnalités utiles


▍ Échantillonnage d'échantillons aléatoires à partir d'un ensemble de données


J'utilise la fonction df.samplechaque fois que j'ai besoin d'obtenir un petit ensemble aléatoire de lignes à partir d'un grand bloc de données. Si un paramètre est utilisé frac=1, la fonction vous permet d'obtenir un analogue de la trame de données d'origine, dont les lignes seront mélangées.

anime.sample(frac=0.25)


Résultats d'équipe

▍Sélection des lignes du bloc de données


La construction suivante vous permet d'itérer sur les lignes d'un bloc de données:

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


Résultats d'équipe

▍ Erreur de dépassement du débit de données IOPub


Si vous rencontrez une erreur IOPub data rate exceeded, essayez d'utiliser la commande suivante lors du démarrage de Jupyter Notebook:

jupyter notebook — NotebookApp.iopub_data_rate_limit=1.0e10

Sommaire


Ici, j'ai parlé de quelques pandasastuces utiles pour utiliser l'environnement Jupyter Notebook. J'espère que mon aide-mémoire vous sera utile.

Chers lecteurs! Y a-t-il des opportunités pandassans lesquelles vous ne pouvez pas imaginer votre travail quotidien?


All Articles