R 机器学习中的数据转换

R 机器学习中的数据转换,r,python-2.7,numpy,pandas,graphlab,R,Python 2.7,Numpy,Pandas,Graphlab,我有一个包含SKU id及其计数的数据集,我需要将这些数据输入机器学习算法,以使SKU id成为列,计数位于事务id和SKU id的交叉点。有人能建议如何实现此转换吗 当前数据 TransID SKUID COUNT 1 31 1 1 32 2 1 33 1 2 31 2 2 34 -1

我有一个包含SKU id及其计数的数据集,我需要将这些数据输入机器学习算法,以使SKU id成为列,计数位于事务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  

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
排列

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

在Pandas中,可以使用枢轴:

>>> 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

在GraphLab/SFrame中,相关命令是
unstack
unpack

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 |
+---------+----+----+----+----+