机器学习的数据转换
Data transformation for machine learning
我有包含 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
在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)
在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 |
+---------+----+----+----+----+
我有包含 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
在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)
在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 |
+---------+----+----+----+----+