[Pandas_flavor] Ajouter une méthode de Pandas DataFrame

TL;DR

BEFORE


dataframe_ = dataframe.loc[(dataframe.time == 'pre') & \
                           (dataframe.group == 'exp') & \
                           (dataframe.cond == 'a'), :]
sns.regplot(x='mood', y='score', data=dataframe_)

↓↓↓

AFTER


dataframe.by(time='pre', cond='exp', group='a').regplot(x='trait', y='score')

Vous pouvez ajouter vos méthodes préférées aux pandas DataFrame (et Series) en utilisant pandas_flavor.

motivation

** Il est difficile d'extraire les pièces qui remplissent les conditions des données au format Long! ** **

Par exemple, supposons que vous ayez ces données.

スクリーンショット 2020-11-20 10.46.29.png

Le cadre était que 50 sujets ont été divisés en deux groupes (groupe: exp, ctrl), et une intervention a été effectuée dans chaque groupe. La tâche a été réalisée avant et après l'intervention (temps: pré, post), et le score a été mesuré dans les deux conditions (cond: a, b) pendant la tâche. En même temps, l'humeur (humeur) lors de l'exécution de la tâche a également été mesurée pour chaque condition (cond: a, b). [^ 1]

Si les données de mesure sont résumées dans un format long comme indiqué dans l'image ci-dessus, l'analyse ultérieure sera plus facile.

Eh bien, avant de faire diverses analyses, pour le moment ** Tracons la corrélation entre le score et l'humeur lorsque la condition de tâche a du groupe exp dans pre est **.

Les lignes qui remplissent les conditions ci-dessus seront extraites, le code ressemblera donc à ceci.

dataframe_ = dataframe.loc[(dataframe.time == 'pre') & \
                           (dataframe.group == 'exp') & \
                           (dataframe.cond == 'a'), :]
sns.regplot(x='mood', y='score', data=dataframe_)

Je crée une série de type booléen qui exprime les conditions et je la mets dans .loc. Eh bien, c'est un peu sale.

Si vous utilisez la méthode .query (), vous pouvez écrire comme ceci.

dataframe_ = dataframe.query('time == "pre" & group == "exp" & cond == "a"')
sns.regplot(x='mood', y='score', data=dataframe_)

Celui-ci est beaucoup plus propre, mais je me demande s'il se sent un peu mieux. Il semble que la méthode d'utilisation de .query () soit plus lente que la méthode d'utilisation de la série booléenne. Après tout, il est difficile d'extraire les pièces qui remplissent les conditions des données ** au format long! ** **

Ajouter une méthode pour Pandas DataFrame

** Ensuite, vous devez créer une méthode **

Par conséquent, créons une ** nouvelle méthode ** qui extrait les lignes qui remplissent les conditions du DataFrame. ↓ Ajoutez une nouvelle méthode .by () qui peut être utilisée comme ceci à DataFrame.

dataframe.by(time='pre', cond='exp', group='a')

Vous pouvez facilement y parvenir avec un package appelé pandas_flavor.

Comment installer

pip ou

pip install pandas_flavor

C'est un coup avec conda.

conda install -c conda-forge pandas_flavor

Exemple d'utilisation

import pandas_flavor as pf


@pf.register_dataframe_method
def by(self, **args):
    for key in args.keys():
        self = self.loc[self.loc[:, key] == args[key], :]
    return self

Écrivez simplement une fonction et ajoutez @ pf.register_dataframe_method comme décorateur. Dans cet exemple, l'argument est reçu en tant que dictionnaire en faisant «** args». Cela extrait la ligne spécifiée par chaque argument.

En outre, il serait bien de transformer diverses fonctions d'origine marine en méthodes.

@pf.register_dataframe_method
def regplot(self, **args):
    return sns.regplot(data=self, **args)

スクリーンショット 2020-11-20 13.01.55.png

Et ça ressemble à ça. Si vous voulez ajouter une méthode à pandas.Series, vous pouvez faire de même avec @ pf.register_series_method.

Dans cet exemple ... je pense que c'est correct d'utiliser .query (), mais il semble que cela puisse être appliqué de différentes manières.

[^ 1]: Inutile de dire que c'est une fausse expérience psychologique. Les valeurs numériques sont générées par le module aléatoire.

Recommended Posts

[Pandas_flavor] Ajouter une méthode de Pandas DataFrame
[Python] Résumé de la méthode de création de table utilisant DataFrame (pandas)
Comportement de la méthode pandas rolling ()
Fonction pratique pour ajouter des colonnes n'importe où dans Pandas DataFrame
Créez un Dataframe pandas à partir d'une chaîne.
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Un petit examen minutieux de Pandas 1.0 et Dask
[Python] Ajouter le nombre total de lignes à Pandas DataFrame
Créer un bloc de données à partir d'Excel à l'aide de pandas
Pandas: un exemple très simple de DataFrame.rolling ()
Téléchargez Pandas DataFrame sous forme de fichier CSV
[Python] Comment lire le fichier csv (méthode read_csv du module pandas)
Clustering de méthodes de clustering
Un mémorandum de méthode souvent utilisé lors de l'analyse de données avec des pandas (pour les débutants)
Fonctionnement de base de Python Pandas Series et Dataframe (1)
Ceci est un exemple d'application de fonction dans dataframe.
Ajouter une liste de fonctions de bibliothèque numpy petit à petit --a
Prenez note de la liste des utilisations de base de Pandas
Résumé des méthodes de prétraitement pour les débutants en Python (trame de données Pandas)
Parallélisation de la méthode de classe
À propos de MultiIndex of Pandas
Fonctionnement de base des Pandas
Création d'une méthode pour sélectionner et visualiser automatiquement un graphique approprié pour les pandas DataFrame
Application Python: Pandas # 3: Dataframe
Résumé de la méthode d'essai
Ajouter une liste de fonctions de la bibliothèque numpy petit à petit --- b
Une implémentation Python simple de la méthode k-voisinage (k-NN)
Ajouter une liste de fonctions de bibliothèque numpy petit à petit --c
Combinez des listes dans un DataFrame avec des pandas
Une collection de méthodes utilisées lors de l'agrégation de données avec des pandas