我使用循环神经网络来消耗时间序列事件(点击流)。我的数据需要格式化,以便每行包含id的所有事件。我的数据是单热编码的,我已经用id对它进行了分组。另外,我限制每个id的事件总数(例如2),因此最终宽度将始终是已知的(#one-hot cols x #events)。我需要保持事件的顺序,因为它们是按时间排序的。
当前数据状态:
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
问题,但我生成的数据帧不符合我需要的格式。关于如何处理这个问题的任何建议?
答案 0 :(得分:5)
这里的想法是reset_index
在'id'
的每个组中,以计算我们所在的那个特定'id'
的哪一行。然后使用unstack
和sort_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
答案 1 :(得分:2)
您可以先使用cumcount
为新列名创建新列,然后set_index
和unstack
。然后,您需要按sort_index
对1
级别的列进行排序,从MultiIndex
和reset_index
的列中删除list comprehension
:
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