Sklearn 标签编码多列 pandas 数据框

新手上路,请多包涵

我尝试在大型熊猫数据框中对包含分类数据( "Yes""No" )的许多列进行编码。完整的数据框包含 400 多列,因此我正在寻找一种方法来对所有需要的列进行编码,而不必对它们进行逐一编码。我使用 Scikit-learn LabelEncoder 对分类数据进行编码。

不必对数据帧的第一部分进行编码,但是我正在寻找一种方法来直接对所有包含分类日期的所需列进行编码,而无需拆分和连接数据帧。

为了证明我的问题,我首先尝试在数据框的一小部分上解决它。然而,卡在数据拟合和转换的最后部分并得到 ValueError: bad input shape (4,3) 。我运行的代码:

 # Create a simple dataframe resembling large dataframe
    data = pd.DataFrame({'A': [1, 2, 3, 4],
                         'B': ["Yes", "No", "Yes", "Yes"],
                         'C': ["Yes", "No", "No", "Yes"],
                         'D': ["No", "Yes", "No", "Yes"]})

# Import required module
from sklearn.preprocessing import LabelEncoder

# Create an object of the label encoder class
labelencoder = LabelEncoder()

# Apply labelencoder object on columns
labelencoder.fit_transform(data.ix[:, 1:])   # First column does not need to be encoded

完整的错误报告:

 labelencoder.fit_transform(data.ix[:, 1:])
Traceback (most recent call last):

  File "<ipython-input-47-b4986a719976>", line 1, in <module>
    labelencoder.fit_transform(data.ix[:, 1:])

  File "C:\Anaconda\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 129, in fit_transform
    y = column_or_1d(y, warn=True)

  File "C:\Anaconda\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 562, in column_or_1d
    raise ValueError("bad input shape {0}".format(shape))

ValueError: bad input shape (4, 3)

有谁知道如何做到这一点?

原文由 HelloBlob 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 821
1 个回答

如以下代码,您可以通过将 LabelEncoder 应用于DataFrame来对多列进行编码。但是,请注意,我们无法获取所有列的类信息。

 import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame({'A': [1, 2, 3, 4],
                   'B': ["Yes", "No", "Yes", "Yes"],
                   'C': ["Yes", "No", "No", "Yes"],
                   'D': ["No", "Yes", "No", "Yes"]})
print(df)
#    A    B    C    D
# 0  1  Yes  Yes   No
# 1  2   No   No  Yes
# 2  3  Yes   No   No
# 3  4  Yes  Yes  Yes

# LabelEncoder
le = LabelEncoder()

# apply "le.fit_transform"
df_encoded = df.apply(le.fit_transform)
print(df_encoded)
#    A  B  C  D
# 0  0  1  1  0
# 1  1  0  0  1
# 2  2  1  0  0
# 3  3  1  1  1

# Note: we cannot obtain the classes information for all columns.
print(le.classes_)
# ['No' 'Yes']

原文由 Keiku 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题