如何在Pandas数据帧的多个列中进行onehot编码,以便以后与ScikitLearn一起使用

2024-05-15 08:09:53 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据

import pandas as pd
data = {
    'Reference': [1, 2, 3, 4, 5],
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'],
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'],
    'Mileage': [35000, 45000, 121000, 35000, 181000],
    'Year': [2015, 2014, 2012, 2016, 2013]
 }
df = pd.DataFrame(data)

我想在“品牌”和“城镇”两个专栏上做一个热编码,以便训练分类器(比如用Scikit Learn)并预测年份。在

一旦分类器被训练好,我就要预测新的输入数据的年份(不是在训练中使用),在那里我需要重新应用相同的热编码。例如:

^{pr2}$

在这种情况下,如果知道需要对几个列进行编码,并且需要能够在以后对新数据应用相同的编码,那么对Pandas数据帧上的2列进行一次热编码的最佳方法是什么。在

这是How to re-use LabelBinarizer for input prediction in SkLearn的后续问题


Tags: 数据importpandas编码data分类器aspd
2条回答

考虑the following approach。在

演示:

from sklearn.preprocessing import LabelBinarizer
from collections import defaultdict

d = defaultdict(LabelBinarizer)

In [7]: cols2bnrz = ['Brand','Town']

In [8]: df[cols2bnrz].apply(lambda x: d[x.name].fit(x))
Out[8]:
Brand    LabelBinarizer(neg_label=0, pos_label=1, spars...
Town     LabelBinarizer(neg_label=0, pos_label=1, spars...
dtype: object

In [10]: new = pd.DataFrame({
    ...:     'Reference': [6, 7],
    ...:     'Brand': ['Volvo', 'Audi'],
    ...:     'Town': ['Stockholm', 'Munich']
    ...: })

In [11]: new
Out[11]:
   Brand  Reference       Town
0  Volvo          6  Stockholm
1   Audi          7     Munich

In [12]: pd.DataFrame(d['Brand'].transform(new['Brand']), columns=d['Brand'].classes_)
Out[12]:
   Audi  Volkswagen  Volvo
0     0           0      1
1     1           0      0

In [13]: pd.DataFrame(d['Town'].transform(new['Town']), columns=d['Town'].classes_)
Out[13]:
   Berlin  Munich  Stockholm
0       0       0          1
1       0       1          0

您可以使用pandas提供的get_dummies函数来转换分类值。在

像这样。。在

import pandas as pd
data = {
    'Reference': [1, 2, 3, 4, 5],
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'],
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'],
    'Mileage': [35000, 45000, 121000, 35000, 181000],
    'Year': [2015, 2014, 2012, 2016, 2013]
 }
df = pd.DataFrame(data)

train = pd.concat([df.get(['Mileage','Reference','Year']),
                           pd.get_dummies(df['Brand'], prefix='Brand'),
                           pd.get_dummies(df['Town'], prefix='Town')],axis=1)

对于测试数据,您可以:

^{pr2}$

相关问题 更多 >