我想对数据框应用一些分类器,因此不得不对df进行一次热编码。我现在有了标签,但是不知道如何进行?如何将标签恢复为df类型,以及如何使用新的df?
我的数据帧减少了,没有NaN值。我首先对其进行标签编码,然后再对其进行一次热编码。
categorical_feature_mask = reduced_df.dtypes==object
categorical_cols = reduced_df.columns[categorical_feature_mask].tolist()
categorical_cols
reduced_df[categorical_cols] = reduced_df[categorical_cols].apply(lambda col: le.fit_transform(col))
labeled_df = reduced_df[categorical_cols]
enc = preprocessing.OneHotEncoder()
enc.fit(labeled_df)
onehotlabels = enc.transform(labeled_df).toarray()
onehotlabels
我得到一个形状为(14737,990)的numpy数组,充满了零和一(这当然是我想要的),但是如何将其“合并”回我的数据框(即带有标签等) )
我的目标不是“解码”标签,而是将编码的列与原始df中的其他列“合并”。
答案 0 :(得分:0)
您可以执行以下操作:
reduced_df=pd.DataFrame({
'some_column': [35, 21, 39, 44, 62, 54, 85, 92, 25, 81],
'color' : ['red', 'green', 'blue', 'black', 'black', 'black', 'black', 'black', 'black', 'black'],
'brand' : ['Chrysler', 'BMW', 'Mercedes', 'Mercedes', 'Mercedes', 'Mercedes', 'Mercedes', 'Mercedes', 'Mercedes', 'Mercedes'],
})
categorical_feature_mask = reduced_df.dtypes==object
categorical_cols = reduced_df.columns[categorical_feature_mask].tolist()
labeled_df = reduced_df[categorical_cols]
enc = OneHotEncoder()
enc.fit(labeled_df)
onehotlabels = enc.transform(labeled_df).toarray()
new_columns=list()
for col, values in zip(labeled_df.columns, enc.categories_):
new_columns.extend([col + '_' + str(value) for value in values])
new_df= pd.concat([reduced_df, pd.DataFrame(onehotlabels, columns=new_columns)], axis='columns')
new_df
输出为:
Out[44]:
some_column color brand color_black ... color_red brand_BMW brand_Chrysler brand_Mercedes
0 35 red Chrysler 0.0 ... 1.0 0.0 1.0 0.0
1 21 green BMW 0.0 ... 0.0 1.0 0.0 0.0
2 39 blue Mercedes 0.0 ... 0.0 0.0 0.0 1.0
3 44 black Mercedes 1.0 ... 0.0 0.0 0.0 1.0
4 62 black Mercedes 1.0 ... 0.0 0.0 0.0 1.0
5 54 black Mercedes 1.0 ... 0.0 0.0 0.0 1.0
6 85 black Mercedes 1.0 ... 0.0 0.0 0.0 1.0
7 92 black Mercedes 1.0 ... 0.0 0.0 0.0 1.0
8 25 black Mercedes 1.0 ... 0.0 0.0 0.0 1.0
9 81 black Mercedes 1.0 ... 0.0 0.0 0.0 1.0
[10 rows x 10 columns]