作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设,我有一个包含百万行的 DataFrame。在这里,每一行代表一个购物者,每个单元格中的每个数字表示项目代码。数据库中大约有 250 个项目。一张玩具 table 如下图
import pandas as pd
import numpy as np
df = pd.DataFrame({'item1':[10, 10, 22, 89],
'item2':[15, 35, 33, 103],
'item3':[np.NaN, 65, 47, 41],
'item4':[np.NaN, np.NaN, 10, 22]})
df
目标是将上面的表转换成一个单热编码表/DataFrame(每一行仍然代表一个购物者),例如
因此,最终的数据框形状类似于 (1000000, 250)。有没有办法快速将 DataFrame 转换为 one-hot 编码表?
最佳答案
使用 sklearn 的 OneHotEncoder
:
sparse=False
因为你想要密集的二维输出fillna
使用一些数值(例如 -1),然后删除该列
groupby.sum
聚合重复的列(感谢 @enke )from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse=False)
e = encoder.fit_transform(df.fillna(-1))
out = pd.DataFrame(e,
columns=np.hstack(encoder.categories_).astype(int),
index=encoder.feature_names_in_,
dtype=int,
).drop(columns=[-1]).groupby(level=0, axis=1).sum()
输出:
10 15 22 33 35 41 47 65 89 103
item1 1 1 0 0 0 0 0 0 0 0
item2 1 0 0 0 1 0 0 1 0 0
item3 1 0 1 1 0 0 1 0 0 0
item4 0 0 1 0 0 1 0 0 1 1
关于python - 如何将 pandas DataFrame 转换为单热编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71268897/
我是一名优秀的程序员,十分优秀!