2017-07-30 62 views
1

我有100万点的记录训练集和测试集的100为了创建一个推荐系统,我已经创建了组织为这样的两个dataframes:热编码:缺少列

[in]print(training_df.head(n=5)) 

[out]      product_id 
transaction_id      
0000001     [P06, P09] 
0000002   [P01, P05, P06, P09] 
0000003     [P01, P06] 
0000004     [P01, P09] 
0000005     [P06, P09] 

我然后使用sklearn创建一个矩阵,其中product_id是列,transaction_id是行(索引)。

下面是代码:

# Create a matrix for the transactions 
from sklearn.preprocessing import MultiLabelBinarizer 

mlb = MultiLabelBinarizer() 
training_df1 = training_df.join(pd.DataFrame(mlb.fit_transform(training_df.pop('product_id')), 
          columns=mlb.classes_, 
          index=training_df.index)) 

的PRODUCT_ID的是P01-P10。问题是训练数据中缺少P04和P08,所以我的training_df1只有8个而不是10个。我怎样才能添加这两列并在所有事务中填入0?

回答

2

您可以初始化MultiLabelBinarizer当通过预定义的产品的IDS P01-P10如类,因而输出将始终包括这些类别为列:

from sklearn.preprocessing import MultiLabelBinarizer 
​ 
product_ids = ['P{:02d}'.format(i+1) for i in range(10)] 
print(product_ids) 
# ['P01', 'P02', 'P03', 'P04', 'P05', 'P06', 'P07', 'P08', 'P09', 'P10'] 
​ 
mlb = MultiLabelBinarizer(classes=product_ids) 
training_df.join(pd.DataFrame(mlb.fit_transform(training_df['product_id']), 
           columns=mlb.classes_, 
           index=training_df.index)) 

enter image description here


要获得矩阵仅返回:

training_df.drop('product_id', 1).join(
    pd.DataFrame(mlb.fit_transform(training_df['product_id']), columns=mlb.classes_, index=training_df.index) 
) 

enter image description here

+0

我得到'code'(Key Error:'product_id')。此外,我不想返回'product_id'列,只有矩阵。 – zsad512

+1

很可能你已经用'pop'方法从'training_df'弹出'product_id'列,我不推荐使用它,因为它修改'training_df'并给你这样的问题。所以试着重建它。另外,你需要'transaction_id'列,还是只需要P01-P10? – Psidom

+0

好的,我认为你是对的,我会重建df并再次尝试 - 但是,保留transaction_id列会很有帮助,但是包含product_id列会因为数据已经存在而变得有点冗余。 – zsad512