python - 使用 pandas 或 scikit-learn 对多维数组进行一次性编码

标签 python pandas scikit-learn vectorization one-hot-encoding

我正在尝试为我的数据框编码 one-hot。这是一个多维数组,我不知道该怎么做。数据框可能如下所示:

df = pd.DataFrame({'menu': [['Italian', 'Greek'], ['Japanese'], ['Italian','Greek', 'Japanese']], 'price': ['$$', '$$', '$'], 'location': [['NY', 'CA','MI'], 'CA', ['NY', 'CA','MA']]})

enter image description here

我想要的输出是这样的:

df2 = pd.DataFrame({'menu': [[1,1,0], [0,0,1], [1,1,1]], 'price': [[1,0], [1,0], [0,1]], 'location': [[1,1,1,0], [0,1,0,0], [1,1,0,1]]})

enter image description here

我不确定如何使用 pd.get_dummies 或 scikit-learn 完成此操作。 有人能帮我吗?

最佳答案

您可以使用:

#create list with one item values
df = df.applymap(lambda x: x if isinstance(x, list) else [x])
print (df)
       location                        menu price
0  [NY, CA, MI]            [Italian, Greek]  [$$]
1          [CA]                  [Japanese]  [$$]
2  [NY, CA, MA]  [Italian, Greek, Japanese]   [$]

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
#create Series for each column by list comprehension
vals = [pd.Series(mlb.fit_transform(df[x]).tolist()) for x in df.columns]
#concat to df
df2 = pd.concat(vals, keys=df.columns, axis=1)
print (df2)

       location       menu   price
0  [1, 0, 1, 1]  [1, 1, 0]  [0, 1]
1  [1, 0, 0, 0]  [0, 0, 1]  [0, 1]
2  [1, 1, 0, 1]  [1, 1, 1]  [1, 0]

关于python - 使用 pandas 或 scikit-learn 对多维数组进行一次性编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46212885/

相关文章:

python - Pytorch "Unfold"相当于 Tensorflow

python - 为什么我不能将 x 和 y 标签设置为 pd.plot() 的参数,而我可以轻松设置类似的东西,例如标题?

python - 在 Jupyterlab 中导入 sklearn.compose.make_column_selector 时遇到问题

python - 随机森林分类器的决策路径

python-3.x - ImportError:无法导入名称 'cross_validate'

python - 如何使用python执行 '<(cat fileA fileB)'?

python - Mac 和 Windows 中的 Pythons time.clock() 有什么区别?

python - 使用 bool 子索引更新数据框

python - 如何在 Anaconda (python3) 上安装 pyWavelets 包?

python - 当 slice 有一行结果时返回 pandas.DataFrame