2016-11-15 5 views
0

Ich versuche, eine neue Spalte zu einem vorhandenen Pandas-Datenrahmen mydf zuweisen. Die hinzuzufügende Reihe ist das Ergebnis der Auswertung eines Ausdrucks, der als String übergeben wird. Der Ausdruck kann Python Funktionsaufrufe zum Beispiel enthalten:Assign in Pandas mit Zeitreihendaten und groupby

formula = 'myfunction(mydf.v1)' 

myfunction wie

def myfunction(series): 
    return recursive_filter(series, 0.1) 
folgt

Der folgende Code den Ausdruck auswertet und auszuführen myfunction und weisen die Spalte v2 zu mydf

mydf.assign(v2 = eval(formula)) 

Allerdings muss ich die Funktion von Market ausführen. Die Ausgabe sollte wie die Tabelle unten aussehen

Market  Date   v1 v2 
UK   2013-01-01 10 10.00 
UK   2013-01-02 10 11.00 
UK   2013-01-03 10 11.10 
UK   2013-01-04 10 11.11 
US   2013-01-01 10 10.00 
US   2013-01-02 10 11.00 
US   2013-01-03 10 11.10 
US   2013-01-04 10 11.11 

ich den folgenden Code versucht (was ich nicht sicher bin, würde das richtige Ergebnis produzieren ...)

mydf.groupby('CrossSection').apply(mydf.assign(v2 = eval(formula))) 

aber dies erzeugt diesen Fehler

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed 

Antwort

0

Eines der Probleme, die Sie haben, ist, dass die Formel den DataFrame fest codiert, um es anzuwenden, dh mydf.

Wie auch immer, hier ist etwas, das funktionieren sollte. Ich konnte keinen Weg finden, keinen anderen Datenrahmen zu erstellen, aber wenn Ihr Datensatz nicht sehr groß ist, sollte das nicht viel ausmachen.

Ich schrieb die Formel so um, dass sie eine Zeichenfolgenformatierung akzeptiert, auf welche Datenrahmen sie angewendet werden soll.

from statsmodels.tsa.filters.filtertools import recursive_filter 

formula = 'myfunction({}.v1)' 
def myfunction(series): 
    return recursive_filter(series, 0.1) 

df2 = mydf.groupby('Market').apply(lambda df: df.assign(v2 = eval(formula.format("df")))) 
df2.index = df2.index.droplevel(level=0) 
df2 

Ergebnis:

Market  Date v1  v2 
0  UK 2013-01-01 10 10.00 
1  UK 2013-01-02 10 11.00 
2  UK 2013-01-03 10 11.10 
3  UK 2013-01-04 10 11.11 
4  US 2013-01-01 10 10.00 
5  US 2013-01-02 10 11.00 
6  US 2013-01-03 10 11.10 
7  US 2013-01-04 10 11.11