2017-01-16 42 views
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時給出新的組標識。與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'和實際事件'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 
相關問題