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')
Sie können dem Pandas DataFrame (und der Serie) mithilfe von pandas_flavor Ihre bevorzugten Methoden hinzufügen.
** Es ist mühsam, die Teile, die die Bedingungen erfüllen, aus den Langformatdaten zu extrahieren! ** ** **
Angenommen, Sie haben diese Daten.
Die Einstellung war, dass 50 Probanden in zwei Gruppen eingeteilt wurden (Gruppe: exp, ctrl) und in jeder Gruppe einige Interventionen durchgeführt wurden. Die Aufgabe wurde vor und nach dem Eingriff durchgeführt (Zeit: vor, nach), und die Punktzahl wurde unter den beiden Bedingungen (Bedingung: a, b) während der Aufgabe gemessen. Gleichzeitig wurde die Stimmung bei der Ausführung der Aufgabe für jede Bedingung gemessen (Bedingung: a, b). [^ 1]
Wenn die Messdaten wie im obigen Bild im Langformat zusammengefasst sind, ist die nachfolgende Analyse einfacher.
Nun, bevor Sie vorerst verschiedene Analysen durchführen ** Zeichnen wir die Korrelation zwischen Punktzahl und Stimmung, wenn die Aufgabenbedingung a der Exp-Gruppe in pre ** ist.
Zeilen, die die oben genannten Bedingungen erfüllen, werden extrahiert, sodass der Code folgendermaßen aussieht.
dataframe_ = dataframe.loc[(dataframe.time == 'pre') & \
(dataframe.group == 'exp') & \
(dataframe.cond == 'a'), :]
sns.regplot(x='mood', y='score', data=dataframe_)
Ich mache eine Bool-Typ-Serie, die die Bedingungen ausdrückt, und setze sie in ".loc". Nun, es ist irgendwie schmutzig.
Wenn Sie die Methode ".query ()" verwenden, können Sie wie folgt schreiben.
dataframe_ = dataframe.query('time == "pre" & group == "exp" & cond == "a"')
sns.regplot(x='mood', y='score', data=dataframe_)
Dieser ist viel sauberer, aber ich frage mich, ob er sich etwas besser anfühlt.
Es scheint, dass die Methode zur Verwendung von .query ()
langsamer ist als die Methode zur Verwendung von bool's Series.
Schließlich ist es mühsam, die Teile, die die Bedingungen erfüllen, aus den ** Langformatdaten zu extrahieren! ** ** **
** Dann sollten Sie eine Methode erstellen **
Erstellen wir daher eine ** neue Methode **, die Zeilen aus dem DataFrame extrahiert, die die Bedingungen erfüllen.
↓ Fügen Sie DataFrame eine neue .by ()
Methode hinzu, die auf diese Weise verwendet werden kann.
dataframe.by(time='pre', cond='exp', group='a')
Sie können dies leicht mit einem Paket namens pandas_flavor erreichen.
pip oder
pip install pandas_flavor
Es ist ein Schuss mit 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
Schreiben Sie einfach eine Funktion und fügen Sie "@ pf.register_dataframe_method" als Dekorateur hinzu. In diesem Beispiel wird das Argument als Wörterbuch empfangen, indem "** args" ausgeführt wird. Dies extrahiert die durch jedes Argument angegebene Zeile.
Darüber hinaus wäre es schön, verschiedene Seaborn-Funktionen in Methoden umzuwandeln.
@pf.register_dataframe_method
def regplot(self, **args):
return sns.regplot(data=self, **args)
Und so sieht es aus.
Wenn Sie pandas.Series eine Methode hinzufügen möchten, können Sie dasselbe mit @ pf.register_series_method
tun.
In diesem Beispiel ... Ich denke, es ist in Ordnung, ".query ()" zu verwenden, aber es scheint, dass es auf verschiedene Arten angewendet werden kann.
[^ 1]: Unnötig zu sagen, es ist alles ein falsches psychologisches Experiment. Numerische Werte werden vom Zufallsmodul generiert.
Recommended Posts