2016-09-19 67 views
3

我正在使用循環神經網絡來消耗時間序列事件(點擊流)。我的數據需要格式化,每行包含一個id的所有事件。我的數據是一種熱門編碼,我已經通過id對它進行了分組。此外,我還會限制每個事件(例如2)的事件總數,因此總是知道最終寬度(#one-hot cols x #events)。我需要維護事件的順序,因爲它們是按時間排序的。將多個時間序列行與Pandas結合成一行

當前數據狀態:

 id page.A page.B page.C  
0 001  0  1  0 
1 001  1  0  0 
2 002  0  0  1 
3 002  1  0  0 

所需的數據狀態:

 id page.A1 page.B1 page.C1 page.A2 page.B2 page.C2  
0 001  0   1   0   1   0   0 
1 002  0   0   1   1   0   1 

這看起來像一個pivot問題給我,但我得到的dataframes不是我需要的格式。我應該如何處理這個問題的任何建議?

回答

3

這裏的想法是在'id'的每個組內對reset_index進行計數,以得到我們所在的特定'id'的哪一行。然後按照unstacksort_index的順序獲取它們應該在的列。

最後,弄平multiindex。

df1 = df.set_index('id').groupby(level=0) \ 
    .apply(lambda df: df.reset_index(drop=True)) \ 
    .unstack().sort_index(axis=1, level=1) # Thx @jezrael for sort reminder 

df1.columns = ['{}{}'.format(x[0], int(x[1]) + 1) for x in df1.columns] 

df1 

enter image description here

2

你可以先用cumcount新的列名,然後set_indexunstack創建新列。然後,你需要通過sort_index,排序在1水平列由list comprehension和最後reset_index刪除列MultiIndex

df['g'] = (df.groupby('id').cumcount() + 1).astype(str) 

df1 = df.set_index(['id','g']).unstack() 
df1.sort_index(axis=1,level=1, inplace=True) 
df1.columns = [''.join(col) for col in df1.columns] 
df1.reset_index(inplace=True) 
print (df1) 
    id page.A1 page.B1 page.C1 page.A2 page.B2 page.C2 
0 1  0  1  0  1  0  0 
1 2  0  0  1  1  0  0