2016-11-13 3 views
0

Ich versuche, einen Weg zu finden, um Werte aus verschiedenen Zeilen in einem Datenrahmen zu vergleichen, um eine neue Spalte zu berechnen.Berechne Zeilenwert in Bezug auf vorherige Zeilen in Panda Dataframe

  • Iterate über Zeilen (Ich suche nach einer Lösung vektorisiert):

    ich diese Möglichkeiten habe festgestellt,

mehrfach

for index, row in df.iterrows(): ....

  • Merge die gleichen Datenrahmen Verwenden Sie eine Verschiebung über Index, etwa so:

d1 = data.shift() data.merge(d1[["value col"]], how="inner", left_index=True, right_index=True)

Gibt es eine Möglichkeit, um den aktuellen Datenrahmen von einer Anwendung Methode zuzugreifen:

dataframe.apply(myfunction(row),axis=1) 

def my_function(row, current_dataframe) 
    index = row.name 
    row_to_compare = current_dataframe.iloc[index-delta] 
    row["new column"] = calc(row["value], row_to_compare["value"]) 
    return row 

es als Argument übergeben scheint nicht zu funktionieren:

data.apply(date_diff,axis=1,args=(data)) 
or 
data.apply(lambda row,df: date_diff(row, df),axis=1,args=(data))  

sagte immer wieder:

> ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 

Gibt es einen Weg zu machen es funktioniert?

Vielen Dank.

Antwort

0

Was möchten Sie berechnen?

Wenn es einfach genug ist, können Sie vollständig vektorisieren. Beachten Sie, dass Sie sie einfach als weitere Spalte hinzufügen können, anstatt einen separaten Zusammenführungsschritt auszuführen.

df["same"] = df[col] == df[col2].shift() 

Wenn es ein bisschen komplexer ist, dann können Sie es in mehrere Schritte teilen, wie oben beschrieben? Dies wird immer noch schnell sein.

Wenn Sie mehrere Spalten und Zeilen benötigen, dann müssen Sie anwenden, um Zeile für Zeile oder Spalte für Spalte zu verarbeiten, aber das ist ziemlich langsam. Die schlechteste Antwort ist es, zu iterieren! Sie sollten dies nie tun müssen.

+0

Es ist im Grunde ein abgeleiteter Begriff basierend auf verschiedenen Spalten, wie Sie darauf hinweisen, kann einfach mit shift() -Methode getan werden, aber ich frage mich, ob es in eine Funktion kompiliert werden kann, um den Code lesbarer zu machen. – kothvandir

+0

Natürlich können Sie in einer Anwendungsfunktion alles tun, was Sie wollen. Es wird jedoch massiv langsamer sein. – simon