看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
对多列进行热编码(One-Hot Encoding,简称 OHE)是一种常见的预处理步骤,通常用于将分类变量(categorical variables)转换为机器学习算法能够理解的数值格式。当一个分类变量有多个类别时,热编码可以为每个类别创建一个新的列,每列代表一个类别的出现情况。这对于处理多类别的变量尤其重要,因为它可以显式地表示每个类别是否出现。
我们来看看这样的数据:
import pandas as pd
import io
data = '''
Item N1 N2 N3 N4
Item1 1 2 4 8
Item2 2 3 6 7
Item3 4 5 7 9
Item4 1 5 6 7
Item5 3 4 7 8
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
我们需要对每个数值进行热编码,但到的结果应该如下:
'''
1 2 3 4 5 6 7 8 9
Item1 1 1 0 1 0 0 0 1 0
Item2 0 1 1 0 0 1 1 0 0
Item3 0 0 0 1 1 0 1 0 1
Item4 1 0 0 0 1 1 1 0 0
Item5 0 0 1 1 0 0 1 1 0
'''
数据的值成为每个列的标签,值为对应行标签是与列标签是否有此值。
我们应该先对数据进行「融合」操作(df.melt),是将 宽格式数据 转换为 长格式数据。接着,就有两种不同的方案:
pd.get_dummies()
来实现热编码,然后将相同的 Item 分组合并,并对布尔值求和得到pd.crosstab()
交叉表直接来完成需求。根据思路,第一种方法的代码是:
(
df.melt('Item')
.pipe(pd.get_dummies,
columns=['value'],
prefix='',
prefix_sep='')
.drop('variable', axis=1)
.groupby('Item')
.sum()
.reset_index()
)
'''
1 2 3 4 5 6 7 8 9
Item1 1 1 0 1 0 0 0 1 0
Item2 0 1 1 0 0 1 1 0 0
Item3 0 0 0 1 1 0 1 0 1
Item4 1 0 0 0 1 1 1 0 0
Item5 0 0 1 1 0 0 1 1 0
'''
第二种思路的代码为:
(
df.melt('Item')
.pipe(lambda x: pd.crosstab(x.Item, x.value))
.rename_axis(index=None, columns=None)
)
'''
1 2 3 4 5 6 7 8 9
Item1 1 1 0 1 0 0 0 1 0
Item2 0 1 1 0 0 1 1 0 0
Item3 0 0 0 1 1 0 1 0 1
Item4 1 0 0 0 1 1 1 0 0
Item5 0 0 1 1 0 0 1 1 0
'''
这样就实现了这个需求。
(完)
更新时间:2024-11-05 15:01:29 标签:pandas python 热编码