首页 > 解决方案 > 如何将一个热编码的结果加入数据帧?

问题描述

我想在人口普查数据集中执行 one-hot 编码,网址为:

https://archive.ics.uci.edu/ml/datasets/census+income

我要执行的列在国家列中,所以我做了以下内容:

import pandas as pd
from sklearn import preprocessing

def abrirArchivo(fileR):
    head=["gt lt 50","age","workclass","fnlwgt","edu","edu-num","mar-sta","occ","rela","race","sex","cap-gain","cap-loss","country","hpw"]
    f=pd.read_csv(fileR,sep=',')
    f.columns=head

    ohe=oneHot(f)
    print (ohe)

def oneHot(f):
    f[["country"]]=pd.get_dummies(f[["country"]])
    return f

但我收到一个错误,上面写着:

ValueError: Columns must be same length as key

当我进行序数编码时,我对以下代码没有任何问题:

pp=preprocessing.OrdinalEncoder()
f[["country"]]=pp.fit_transform(f[["country"]])

我想要的是将转换后的 ohe(虚拟变量)连接到我原来的熊猫数据框,以便将其用于分类模型。

有什么帮助吗?

标签: pythonpandas

解决方案


看看pd.get_dummies返回的是什么。现在,尝试考虑是否可以将其放入单个列中!不可能吧?

让我来说明一下。假设你有一个 DataFrame

   col1  col2  
0     1  name1   
1     2  name2   

现在,pd.get_dummies(df['col2'])返回:

     name1  name2
0     0     1
1     1     0

这是一个有两列的 DataFrame ,每一列对应 column 中的每个不同值col2

如果你尝试做

df['col2'] = pd.get_dummies(df['col2'])

您基本上会尝试在单个列中安装包含两列的 DataFrame。不可能!这就是什么ValueError: Columns must be same length as key意思


如果您想在 中获得这些结果df,您可以使用merge,concatjoin. 许多不同的方式(SO中有很多关于此的问题)。一个例子是:

df = df.join(pd.get_dummies(df['col2'])).drop(columns='col2')

*注:drop用于删除原始列。


get_dummies还有一个columns参数,可用于创建虚拟对象一步删除原始列:

df = pd.get_dummies(df, columns=['col2'])

请注意,旧列名变为新列,由下划线 ( )prefix分隔:prefix_sep_

   col1  col2_name1  col2_name2
0     1           1           0
1     2           0           1

推荐阅读