簡體   English   中英

使用Pandas將多個時間序列行合並為一行

[英]Combine multiple time-series rows into one row with Pandas

我使用循環神經網絡來消耗時間序列事件(點擊流)。 我的數據需要格式化,以便每行包含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問題,但我生成的數據幀不是我需要的格式。 關於如何處理這個問題的任何建議?

這里的想法是在每個'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

在此輸入圖像描述

你可以先創建一個新列cumcount新的列名,然后set_indexunstack 然后,您需要通過sort_index對級別1的列進行排序,通過list comprehension MultiIndex從列中刪除MultiIndex並最后reset_index

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM