2017-01-16 4 views
1

私はデータセットを分類しようとしばらく苦労しています。多分誰かが私を助けたり正しい方向を指し示したりするかもしれません。ランダムイベントでデータフレームをグループ化し、グループカウントで新しい列を設定する

私は一連のイベントが1つずつ発生するデータフレームを持っており、あるランダムなポイントでイベントが1つの列に登録されています。

 Timestamp   Event 
0 10/26/2015 22:50:15  0 
1 10/26/2015 22:50:46  0 
2 10/26/2015 22:50:50  0 
3 10/26/2015 22:50:51  0 
4 10/26/2015 22:51:15  1 
5 10/26/2015 22:51:47  0 
6 10/26/2015 22:52:38  0 
7 10/26/2015 22:54:46  1 
8 10/26/2015 22:55:46  0 

すべての発生またはイベント '1'まで発生するレコードの各グループを識別する新しい列を作成する必要があります。そのグループにカウンタを設定します。結果は次のようなものになります。

 Timestamp   Event Group 
0 10/26/2015 22:50:15  0  1 
1 10/26/2015 22:50:46  0  1 
2 10/26/2015 22:50:50  0  1 
3 10/26/2015 22:50:51  0  1 
4 10/26/2015 22:51:15  1  1 
5 10/26/2015 22:51:47  0  2 
6 10/26/2015 22:52:38  0  2 
7 10/26/2015 22:54:46  1  2 

この結果、「1」イベントにつながるレコードは無視されます。

答えて

3

Event列にはcumsum()を使用できます。1になると、新しいグループIDが与えられます。 shift()と組み合わせることで、あなたが意図したとおりにGroup列を作成することができます:

df['Group'] = df.Event.shift().cumsum().fillna(0) + 1 

df.loc[df.index <= df.Event.iloc[::-1].idxmax()] 
# to filter trailing zero records 

enter image description here


別のオプション:

g = df.Event.iloc[::-1].cumsum() 
df.loc[g != 0, 'Group'] = g.max() - g + 1 
df.dropna() 
+0

おかげで、@Psidom!あなたの答えは完璧に働きます!もう1つ質問できますか?イベントが逆数の場合、noイベントの場合は「1」、実際のイベントの場合は「0」となりますか? – Geronimo

+1

'〜df.Event'か' 1-df.Event'のどちらかでこの形式に戻す必要があります。 – Psidom

0
df['Group'] = df.cumsum().drop_duplicates() 
df['Group'] = df['Group'].fillna(method='bfill').astype(int) 
df['Group'][0] = 1 
関連する問題