2016-04-23 60 views
3

我擁有包含SKU ID及其計數的數據集,我需要將此數據提供給機器學習算法,其方式爲SKU ID成爲列,COUNT位於事務ID和SKU ID的交點處。任何人都可以建議如何實現這種轉變。用於機器學習的數據轉換

電流數據

TransID  SKUID  COUNT 
1   31   1 
1   32   2 
1   33   1 
2   31   2 
2   34   -1 

所需數據

TransID  31  32  33  34 
    1   1  2  1  0 
    2   2  0  0  -1 

回答

3

在熊貓,你可以使用透視:

>>> df.pivot('TransID', 'SKUID').fillna(0) 
     COUNT   
SKUID  31 32 33 34 
TransID    
1   1 2 1 0 
2   2 0 0 -1 

爲了避免混淆,最好是明確標註您的變量:

df.pivot(index='TransID', columns='SKUID').fillna(0) 

你可以也執行groupby然後跺腳SKUID

>>> df.groupby(['TransID', 'SKUID']).COUNT.sum().unstack('SKUID').fillna(0) 
SKUID 31 32 33 34 
TransID     
1   1 2 1 0 
2   2 0 0 -1 
4

R,我們可以使用xtabs

xtabs(COUNT~., df1) 
#   SKUID 
#TransID 31 32 33 34 
#  1 1 2 1 0 
#  2 2 0 0 -1 

或者dcast

library(reshape2) 
dcast(df1, TransID~SKUID, value.var="COUNT", fill=0) 
# TransID 31 32 33 34 
#1  1 1 2 1 0 
#2  2 2 0 0 -1 

或者spread

library(tidyr) 
spread(df1, SKUID, COUNT, fill=0) 
+0

@阿爾斯蘭謝謝你的回覆。如果有效,請考慮通過點擊投票旁邊的勾號來接受解決方案 – akrun

2

在GraphLab/SFrame中,相關命令是unstackunpack

import sframe #or import graphlab 
sf = sframe.SFrame({'TransID':[1, 1, 1, 2, 2], 
        'SKUID':[31, 32, 33, 31, 34], 
        'COUNT': [1, 2, 1, 2, -1]}) 

sf2 = sf.unstack(['SKUID', 'COUNT'], new_column_name='dict_counts') 
out = sf2.unpack('dict_counts', column_name_prefix='') 

缺失值可以通過欄填寫:

for c in out.column_names(): 
    out[c] = out[c].fillna(0) 

out.print_rows() 

+---------+----+----+----+----+ 
| TransID | 31 | 32 | 33 | 34 | 
+---------+----+----+----+----+ 
| 1 | 1 | 2 | 1 | 0 | 
| 2 | 2 | 0 | 0 | -1 | 
+---------+----+----+----+----+