2016-09-19 7 views
3

私はリカレントニューラルネットワークを使用して時系列イベント(クリックストリーム)を使用しています。私のデータは、各行がIDのすべてのイベントを含むようにフォーマットする必要があります。私のデータはワンホットエンコードされています。私はすでにIDでグループ分けしています。また、idごとのイベントの総数(例2)を制限するので、最終的な幅は常にわかります(#one-hot cols x #events)。私はイベントの順序を維持する必要があります。なぜなら、時間順に並べられるからです。複数の時系列行を1つの行にまとめます。

現在のデータの状態:

 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問題のように見えますが、私の結果のデータフレームは、私が必要とする形式になっていません。どのように私はこれにアプローチすべきかに関する提案はありますか?

答えて

3

ここでのアイディアは、'id'の各グループ内のreset_indexにあり、その特定の行の数を得るには'id'です。その後、unstacksort_indexをフォローして、それがあると思われる列を取得します。

最後に、マルチインデックスを平坦化します。

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

あなたはまず、新しい列名のcumcountset_indexunstackで新しい列を作成することができます。

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 
:次に、あなたは list comprehension、最後の reset_indexして列から MultiIndexを削除し、 sort_indexによってレベル 1の列を並べ替える必要があります
関連する問題