3

我有带有 SKU ID 及其计数的数据集,我需要将此数据输入机器学习算法,以使 SKU ID 成为列并且 COUNTs 位于事务 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  
4

3 回答 3

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)
于 2016-04-23T04:47:18.730 回答
3

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

您还可以执行 agroupby然后 unstack 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
于 2016-04-23T06:09:21.267 回答
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 |
+---------+----+----+----+----+
于 2016-04-26T17:57:04.233 回答