2017-08-21 23 views
0

我目前有一個數據框如下,它顯示了位置的變化,增加1個單位,減去1個單位或什麼都不做(0)。數據幀操作 - 捕獲值的變化

enter image description here

我想找創建與所述淨位置,其或者是長(1)或平(0)的第二數據幀 - 假設一個淨空(-1)位置是不可能的。

所以邏輯是從0開始,當第一個'位置改變'發生時(任何後續的+1被忽略),切換到1,然後當看到-1時切換回0。

有關如何做到這一點的任何想法?我們的想法是創建DF2按以下

enter image description here

df.cumsum()將工作,如果每個+1「位置的變化」是來算,但我只希望捕捉到「長或扁」不任何積累的多頭頭寸的大小。

輸入數據幀:

enter image description here

輸出數據幀:

enter image description here

+0

最簡單的方法可能只是數據幀的循環 – Deb

+0

@Deb最簡單和最差。 –

+3

OP,請提供您的數據框的複製粘貼,這是不可能的圖像處理。 –

回答

1

這裏是一個矢量化溶液:

df['CiP'].where(df['CiP'].replace(to_replace=0, method='ffill').diff(), 0).cumsum() 

說明:

  • replace的調用將0值替換爲前面的非零值。
  • diff然後指向實際的位置變化。
  • 致電where可確保沒有真正改變的值被0取代。
  • 經過這種處理後,cumsum才起作用。

編輯:如果你有多個列,然後定義一個函數如上並應用它。

def position(series): 
    return series.where(series.replace(to_replace=0, method='ffill').diff(), 0).cumsum() 

df[list_of_columns].apply(position) 

這可能比顯式循環遍歷列略快。

+0

謝謝。假設數據框中有許多列,而不僅僅是一列......我如何在整個數據框中應用此功能,而不僅僅是一個列? –

+0

您可以遍歷列。我猜想你有很多行但列很少,所以迭代的成本應該很低。 – IanS

+0

我有136列和2k行...所以更復雜一點 –