2016-04-23 57 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 | 
+---------+----+----+----+----+