Effiziente Möglichkeit, mehrere Filter auf Pandas DataFrame oder Series anzuwenden

Habe ich ein Szenario, wo ein Benutzer möchte, wenden Sie verschiedene Filter auf ein Pandas DataFrame oder Series-Objekt. Im wesentlichen, ich möchte effizient Kette eine Reihe von filtern (Vergleich operations) zusammen, die angegeben werden, die zur Laufzeit durch den Benutzer.

Müssen die Filter Additiv (aka jeden angewendet werden sollte, schmalen Ergebnisse).

Ich bin derzeit mit reindex() aber dies erzeugt ein neues Objekt jedes mal und Kopien der zugrunde liegenden Daten (sofern verstehe ich die Dokumentation richtig). So, könnte dies wirklich ineffizient, wenn die Filterung einer großen Serie oder DataFrame.

Ich denke, dass mit apply(), map() oder etwas ähnliches wäre vielleicht besser. Ich bin ziemlich neu Pandas obwohl so immer noch versuchen, wickeln Sie meinen Kopf herum alles.

TL;DR

Möchte ich ein Wörterbuch das folgende Formular aus und gelten jede operation, die zu einer bestimmten Serie Objekt-und einen "filtered" - Serie Objekt.

relops = {'>=': [1], '<=': [1]}

Lange Beispiel

Ich beginne mit einem Beispiel, was ich derzeit habe und nur die Filterung ein einzelnes Series-Objekt. Unten ist die Funktion, die ich derzeit benutze:

   def apply_relops(series, relops):
        """
        Pass dictionary of relational operators to perform on given series object
        """
        for op, vals in relops.iteritems():
            op_func = ops[op]
            for val in vals:
                filtered = op_func(series, val)
                series = series.reindex(series[filtered])
        return series

Den Benutzer liefert ein dictionary mit den Operationen, die Sie ausführen möchten:

>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
   col1  col2
0     0    10
1     1    11
2     2    12

>>> from operator import le, ge
>>> ops ={'>=': ge, '<=': le}
>>> apply_relops(df['col1'], {'>=': [1]})
col1
1       1
2       2
Name: col1
>>> apply_relops(df['col1'], relops = {'>=': [1], '<=': [1]})
col1
1       1
Name: col1

Wieder, das "problem" mit meinem obigen Ansatz ist, dass ich denke, es gibt eine Menge von möglicherweise unnötige kopieren der Daten für die in-zwischen den Schritten.

Außerdem würde ich gerne erweitern, so dass das Wörterbuch übergeben, können die Spalten operator und filtern eine ganze DataFrame auf der Grundlage der input-Wörterbuch. Aber ich gehe davon aus, dass was auch immer arbeitet für die Serie können problemlos erweitert werden, um ein DataFrame.

Kommentar zu dem Problem
Auch bin ich mir voll bewusst, dass diese Herangehensweise an das problem könnte Weg sein. Also vielleicht überdenken das ganze Konzept wäre sinnvoll. Ich will einfach nur, um Benutzern zu erlauben, geben Sie einen Satz von filter-Operationen zur Laufzeit ausgeführt werden. Kommentarautor: durden2.0

InformationsquelleAutor der Frage durden2.0 | 2012-11-28

Schreibe einen Kommentar