使用 Scikit-learn 和 Pandas 将编码列连接到原始数据帧

Posted

技术标签:

【中文标题】使用 Scikit-learn 和 Pandas 将编码列连接到原始数据帧【英文标题】:Concatenate encoded columns to original data frame using Scikit-learn and Pandas 【发布时间】:2018-07-29 02:57:22 【问题描述】:

我正在尝试使用 Python 的 Scikit-learn 将 .csv 文件中的所有文本数据编码为数字。我在数据类型为object 的列上使用LabelEncoderOneHotEncoder。我想知道如何将新的编码列与原始数据帧连接起来——在这种情况下是df。我是新手,非常感谢一些帮助。这是我的代码:

"""Encode all columns with type Object using LabelEncoder"""
columnsToEncode=df.select_dtypes(include=[object])

labelEncoder = preprocessing.LabelEncoder()
df_2 = columnsToEncode.apply(labelEncoder.fit_transform)

"""Now encode using OneHotEncoder"""
oneHotEncoder = preprocessing.OneHotEncoder()
df_3=oneHotEncoder.fit_transform(df_2)

【问题讨论】:

所以您希望您的数据框拥有实际的文本数据以及编码数据?您想将编码的列/数据与原始数据帧连接/合并的任何特殊原因? @asimo 我想用编码数据替换实际的文本数据列以应用 K-means 聚类 【参考方案1】:

有几种方法可以做到这一点。假设您想对独立变量进行编码,您可以使用 pd.get_dummies 并包含 drop_first=True 。这是一个例子:

import pandas as pd

# Create a data of independent variables X for the example
X = pd.DataFrame('Country':['China', 'India', 'USA', 'Indonesia', 'Brasil'],
                   'Continent': ['Asia', 'Asia', 'North America', 'Asia', 'South America'],
                   'Population, M': [1403.5, 1324.2, 322.2, 261.1, 207.6])

print(X)

# Encode
columnsToEncode=X.select_dtypes(include=[object]).columns
X = pd.get_dummies(X, columns=columnsToEncode, drop_first=True)

print(X)

# X prior to encoding
       Continent    Country  Population, M
0           Asia      China         1403.5
1           Asia      India         1324.2
2  North America        USA          322.2
3           Asia  Indonesia          261.1
4  South America     Brasil          207.6

# X after encoding
   Population, M  Continent_North America  Continent_South America  \
0         1403.5                        0                        0   
1         1324.2                        0                        0   
2          322.2                        1                        0   
3          261.1                        0                        0   
4          207.6                        0                        1   

   Country_China  Country_India  Country_Indonesia  Country_USA  
0              1              0                  0            0  
1              0              1                  0            0  
2              0              0                  0            1  
3              0              0                  1            0  
4              0              0                  0            0

【讨论】:

谢谢@KRKirov。我不太明白drop_first=True 做了什么。你能解释一下吗? drop_first=True 从每个被编码的分类特征中删除一列,以避免重复信息。如果您在使用 drop_first=True 编码后查看上面示例中的五个国家/地区,则中国、印度、印度尼西亚和美国只有四列。巴西的列已被删除,因为信息已经被隐式编码,例如如果该国家不是其他四个国家中的任何一个,那么它就是巴西。未能删除冗余列可能会导致多个回归模型出现问题。 谢谢@KRKirov【参考方案2】:

如果我在这里理解正确,您正在寻找对列进行编码并将它们恢复为数据框格式。 一种方法可能是:

将您的 df 转换为矩阵。

df_array = df.as_matrix(columns=['A','B','C'])

执行编码:

from sklearn import preprocessing  
le = preprocessing.LabelEncoder()    
for i in range(len(df.columns)):   
     df_array[:,i] = le.fit_transform(df_array[:,i])

对于 OneHotEncoder:

enc = OneHotEncoder()
enc.fit(df_array)      

OHE_array=enc.transform(df_array).toarray()

但是,这种 OHE 可以大大增加维度。 因此,您可能需要执行 PCA 或某种降维技术来应用计算上可行的算法。

如果您希望它恢复为数据框格式:

 newdf=pd.DataFrame(df_array, columns=['A','B','C'])   

【讨论】:

谢谢@asimo。这很有帮助,但我也想使用OneHotEncoder。我怎样才能做到这一点并在最后合并到一个数据框? 刚刚编辑了我之前的答案以包含 OneHotEncoder @asimo 我认为这不是正确的方法,因为在一次热编码之后,列数将等于数据框中的分类变量数。那你怎么能只指定三列名称呢?如果你有 100 个不同的值,你会怎么做?

以上是关于使用 Scikit-learn 和 Pandas 将编码列连接到原始数据帧的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas TimeStamp 与 scikit-learn 一起使用

使用 pandas 和 scikit-learn 对多维数组进行 one-hot 编码

在PyODPS DataFrame自定义函数中使用pandasscipy和scikit-learn

用scikit-learn和pandas学习Ridge回归

用scikit-learn和pandas学习线性回归

用scikit-learn和pandas学习线性回归