2017-06-19 17 views
3

私はいくつかの時間差に基づいてnp.whereを使ってPandasシリーズを処理するので、カウンタを増やそうとしています。私は、次の値と直列している場合たとえば、: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 

私は、時間が4が一生の新しいインスタンスだろうと言うよりも大きいのdiffことを前提に、命の数をカウント生涯を作成したいです。

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変数を設定することをだろうとほとんどそこだと思いますそれ以外の場合は、前の値と同じになります。それは状態を運ぶためのきちんとした方法と思われました。しかし、私のループは、おそらく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

関連する問題