关于python:使用OneHotEncoder拆分调查数据

Splitting survey data with OneHotEncoder

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

我将使用这些数据进行一些机器学习,并希望通过OneHotEncoder运行该数据,以5列为1和0结束。

我的初始调查数据的一个示例是:

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

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

Final results


您还可以为此使用MultilabelBinarizer:

1
2
3
4
5
6
7
8
9
10
11
12
13
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]])

这是使用get_dummies的一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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