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.
** 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.
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! ** **
** 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.
pip ou
pip install pandas_flavor
C'est un coup avec conda.
conda install -c conda-forge pandas_flavor
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)
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