2016-02-12 72 views
2

我正在尋找基於在接下來的2行中看到的值在數據框中創建新列。具體來說,如果接下來的兩行中的任何值都低於4,那麼我希望當前行中的新值爲0(並且如果後兩行中的所有值都高於4,那麼我希望當前行中的新值爲1)。創建在熊貓數據框中跨行進行比較的新列

>>> df = pandas.DataFrame({"A": [5,6,7,3,2]}) 
>>> df 
    A 
0 5 
1 6 
2 7 
3 8 
4 2 
>>> desired_result = pandas.DataFrame({"A": [5,6,7,8,2], "new": [1,1,0,0,0]}) 
>>> desired_result 
    A new 
0 5 1 
1 6 1 
2 7 0 
3 8 0 
4 2 0 

在這裏可以看到,在「desired_result」的第一個值是1,因爲圖6和7位均爲> 4(和HTE邏輯同樣適用),直到第三行中的新的值變爲0,因爲當我們展望未來兩行(8,2),然後我們看到2是< 4,所以值變爲0.

我一直在嘗試使用apply函數,但我無法弄清楚如何傳遞下一個2行值作爲輸入。

我在這個網站上發現了很多有關跨欄比較的幫助,但無法弄清楚如何像我描述的那樣「向前看」。

感謝您的幫助!

+0

我不知道第一數據幀與此有關。它並不相關。如果是這樣,不清楚A列中的值如何改變。 – Alexander

+0

你說你想要發生什麼,如果有的話<4,如果所有的都是> 4,那麼怎麼辦? – DSM

+0

@亞歷山大感謝您指出 - 我有一個錯字在我的問題,我已經修復了第一個數據框現在 – reese0106

回答

2

您可以將new的值設置爲1,然後使用locshiftlt(小於)將相應的值設置爲零。

df = pd.DataFrame({"A": [5, 6, 7, 8, 2]}) 
df['new'] = 1 

df.loc[(df.A.shift(-1).lt(4)) | (df.A.shift(-2).lt(4)), 'new'] = 0 

# The last value does not have any future observations and should be set to zero. 
df.new.iat[-1] = 0 

>>> df 
    A new 
0 5 1 
1 6 1 
2 7 0 
3 8 0 
4 2 0 

擴展到下一個8行,而不是2:

nrows = 8 
df.loc[eval(" | ".join("df.A.shift(-{0}).lt(4)".format(n) 
         for n in range(1, nrows + 1))), 'new'] = 0 
+0

我現在想知道是否有任何方法可以使這一點更加動態,我們要檢查是否有任何接下來的n行的差異大於X.例如,如果第一行是5,那麼如果接下來的4行都在5之內,我會希望該值保持爲1。您認爲最簡單的方法是什麼? – reese0106

+0

請把它作爲一個新問題發佈。 – Alexander