2016-11-13 62 views
0

我想了解一種方法來比較數據框中不同行的值以計算新列。計算引用熊貓數據幀中的前一行的行值

我發現這些方法來

  • 迭代行(我正在尋找一個解決方案矢量):

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

  • 合併相同的數據幀多次使用換檔指數,如下所示:

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

有沒有辦法從申請方法訪問當前數據幀:

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 

將它作爲論據似乎不工作:

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

口口聲聲說:

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

有沒有辦法讓 這行得通?

謝謝。

回答

0

你想計算什麼?

如果它足夠簡單,您可以完全矢量化。請注意,您可以將其添加爲另一列,而不是單獨執行合併步驟。

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

如果它有點複雜,那麼你可以將它分成多個步驟,如上所述?這仍然會很快。

如果您需要多個列和行,那麼您將不得不使用apply來逐列或逐列逐行處理,但這非常緩慢。最壞的答案是迭代!你永遠不需要這樣做。

+0

它基本上是一個基於不同列的衍生術語,因爲您指出它可以簡單地使用shift()方法完成,但我想知道它是否可以編譯爲函數以使代碼更具可讀性。 – kothvandir

+0

當然,你可以在應用函數中做任何你想做的事情。然而,它會大大減慢。 – simon