2016-07-13 120 views
1

我有一個時間序列數據集,看起來有點像熊貓value_counts進入新列

ts     userid v1 v2 
2016-04-23 10:50:12 100001 10 ac 
2016-04-23 11:23:29 100002 11 ad 
2016-04-23 11:56:57 100002 11 ad 
2016-04-23 12:33:38 100001 12 ae 
2016-04-23 13:06:43 100001 13 aa 
2016-04-23 14:16:34 100001 14 ag 
2016-04-23 15:26:39 100002 15 ab 
2016-04-23 23:29:31 100003 23 aw 

我想提取v1計數爲每個用戶 - 到類似

userid v1_0 ... v1_10 v1_11 v1_12 v1_13 v1_14 v1_15 ... v1_23 
100001  0 ... 1  0  1  1  1  0 ... 0 
100002  0 ... 0  2  0  0  0  1 ... 0 
100003  0 ... 0  0  0  0  0  0 ... 1 
一個新的數據幀
  • v1小時白天(最大24個值),因此暗示24新列噸Ø加入
  • v2表示事件的類型
  • v1_11是2的用戶ID 100002因爲有11AM中午

2點之間的事件可能有人請建議如何可以利用熊貓來實現?

在此先感謝。


下面就來重建原始數據幀的一個片段,

import pandas as pd 

l1 = ['2016-04-23 10:50:12', '2016-04-23 11:23:29', '2016-04-23 11:56:57', 
     '2016-04-23 12:33:38', '2016-04-23 13:06:43', '2016-04-23 14:16:34', 
     '2016-04-23 15:26:39', '2016-04-23 23:29:31'] 
l2 = [100001, 100002, 100002, 100001, 100001, 100001, 100002, 100003] 
l3 = [10, 11, 11, 12, 13, 14, 15, 23] 
l4 = ['ac','ad','ad','ae', 'aa','ag', 'ab', 'aw'] 
df = pd.DataFrame({'ts':l1, 'userid':l2, 'v1':l3, 'v2':l4}) 

回答

5

你可以用交叉做到這一點:

pd.crosstab(df['userid'], df['v1']) 
Out[30]: 
v1  10 11 12 13 14 15 23 
userid        
100001 1 0 1 1 1 0 0 
100002 0 2 0 0 0 1 0 
100003 0 0 0 0 0 0 1 

其他辦法,看看this answer

+0

比我漂亮得多。 – piRSquared

+0

如果我沒有龐大的數據集,交叉表通常是我的第一選擇。 – ayhan

2

這樣做:

df.groupby('userid').v1.value_counts().unstack(0).reindex(range(24)).fillna(0).astype(int).T 

enter image description here