使用OneHotEncoder拆分调查数据

时间:2017-04-26 22:29:09

标签: python pandas scikit-learn

我有一个数据框,其中包含调查结果,其中有选项A-E,可以选择多个选项 - 选项可以是'A'或'A; C; D'等。

我将使用这些数据进行一些机器学习,我希望通过OneHotEncoder运行它,最终得到5列,1和0。

我的初步调查数据的一个例子是:

survey_data = pd.DataFrame({'Q1':  ['A','B','C','A;D', 'D;E', 'F']})

我最初尝试LabelEncoder,但显然最终有很多功能(而不仅仅是A-E)。

Final results

2 个答案:

答案 0 :(得分:2)

您也可以使用MultilabelBinarizer

inputX = [element.split(';') for element in survey_data['Q1']]

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
transformedX = mlb.fit_transform(inputX)

#Out: transformedX
#array([[1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0],
        [1, 0, 0, 1, 0, 0],
        [0, 0, 0, 1, 1, 0],
        [0, 0, 0, 0, 0, 1]])

答案 1 :(得分:1)

这是一种方法,使用get_dummies

import pandas as pd

# example data provided by OP
survey_data = pd.DataFrame({'Q1':  ['A','B','C','A;D', 'D;E', 'F']})

# split out rows with multiple chosen options into columns
tmp = survey_data.Q1.str.split(';').apply(pd.Series)

# one-hot encode columns with get_dummies, then overlay into one df
df = (pd.get_dummies(tmp[0])
        .add(pd.get_dummies(tmp[1]), fill_value=0)
        .astype(int))

print(df)

   A  B  C  D  E  F
0  1  0  0  0  0  0
1  0  1  0  0  0  0
2  0  0  1  0  0  0
3  1  0  0  1  0  0
4  0  0  0  1  1  0
5  0  0  0  0  0  1