2017-06-19 42 views
3

我試圖讓一個計數器增加,因爲我使用np.where基於一些時間差異的日子處理一個熊貓系列。舉例來說,如果我有一個具有以下值的一系列:增加一個計數器的基礎上與一些價值np.where

Date  Value 
01/03/2017 5 
02/03/2017 8 
03/03/2017 3 
04/03/2017 7 
12/03/2017 1 
13/03/2017 3 
14/03/2017 4 

我會去一個系列,看起來像這樣通過這個代碼

df['DIFF'] = df['Date'].diff()/np.timedelta64(1, 'D') 

爲了產生這種數據幀。

Date  Value DIFF 
01/03/2017 5  0 
02/03/2017 8  1 
03/03/2017 3  1 
04/03/2017 7  1 
12/03/2017 1  8 
13/03/2017 3  1 
14/03/2017 4  1 

然後我想創建一個一生計數的生命數,在假設時間比diff的4說是一個千載難逢的新實例更大。

Date  Value DIFF LIFETIME 
01/03/2017 5  0  1 
02/03/2017 8  1  1 
03/03/2017 3  1  1 
04/03/2017 7  1  1 
12/03/2017 1  8  2 
13/03/2017 3  1  2 
14/03/2017 4  1  2 

我覺得我幾乎沒有與此代碼

df['LIFE'] = np.where(df['DIFF'] >=4, life_counter=df.shift(-1)+1, df.shift(-1)) 

這裏的邏輯是,如果DIFF大於或等於4,我將在LIFE變量設置爲先前的+ 1.否則,它將與先前的值相同。這似乎是一種很好的方式來承載國家。但是,我的循環似乎忽略了我設置的狀態,可能是由於np.where的工作原理。有人知道一種方法來做我正在做的事情,並讓它工作。目前,我的輸出看起來像這樣。

Date  Value DIFF LIFETIME 
01/03/2017 5  0  1 
02/03/2017 8  1  1 
03/03/2017 3  1  1 
04/03/2017 7  1  1 
12/03/2017 1  8  2 
13/03/2017 3  1  1 
14/03/2017 4  1  1 

回答

5

我相信你只是想要一個布爾陣列上的累計總和,通過1增強:

>>> df 
     Date Value DIFF 
0 01/03/2017  5  0 
1 02/03/2017  8  1 
2 03/03/2017  3  1 
3 04/03/2017  7  1 
4 12/03/2017  1  8 
5 13/03/2017  3  1 
6 14/03/2017  4  1 
>>> df['LIFETIME'] = np.cumsum(df.DIFF >= 4) + 1 
>>> df 
     Date Value DIFF LIFETIME 
0 01/03/2017  5  0   1 
1 02/03/2017  8  1   1 
2 03/03/2017  3  1   1 
3 04/03/2017  7  1   1 
4 12/03/2017  1  8   2 
5 13/03/2017  3  1   2 
6 14/03/2017  4  1   2 
+0

嗯,很不錯! :D這是一個更好的解決方案,因爲它看起來有問題,使用狀態時的狀態np.where – Eamonn

+1

@Eamonn我不確定你的意思是「狀態問題」,但我認爲你的意思是,'life_counter = df .shift(-1)+1,df.shift(-1)'在函數被調用之前被評估。 –

+0

是的,確切地說。所以,即使生命前值的「狀態」變爲2,下一行評估也沒有看到。 – Eamonn

相關問題