【问题标题】:iterate over columns pandas to encode dtype object to categorical value遍历 pandas 列以将 dtype 对象编码为分类值
【发布时间】:2019-03-08 09:41:08
【问题描述】:

我有一个数据集,其中包含目前未编码的分类值。例如,我有一个名为 condition 的变量,它具有以下值: Very ExcellentExcellentVery Good

我想对这些进行编码(给它们整数值),以便我可以将它们用作回归中的分类虚拟变量。但是,我的数据框中有很多这些,所以我想遍历每一列并对所有 dtype 对象进行编码。 这是我的尝试:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
enc=LabelEncoder()

for column in df_06:
    if df_06["column"].values==object:
        df_06["column"]=enc.fit_transform(df_06["column"])

我的数据框是

错误:

<ipython-input-48-ea6aec86108f> in <module>()
1 for column in df_06:
----> 2 if df_06[column].values==object:
3 df_06[column]=enc.fit_transform(df_06[column])
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

【问题讨论】:

  • 有什么问题?它返回什么?
  • 您是将它们编码为整数还是虚拟变量(又名 One-Hot-Encoding)?这是两种不同的技术。您给出的示例似乎是有序的,最好使用您自己的映射进行编码。例如{'Very Good': 0, 'Excellent': 1, 'Very Excellent': 2}LabelEncoder 不保证正确的顺序
  • 我想将它们编码为假人。什么是无需手动进行映射的快速方法?
  • in () 1 for column in df_06: ----> 2 if df_06[column].values==object: 3 df_06[column ]=enc.fit_transform(df_06[column]) ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

标签: python pandas loops scikit-learn encode


【解决方案1】:

那个for循环有很多错误。例如, pd["column"] 不会调用 value 列。此外,您正在尝试将整列与单个值“对象”(您在 cmets 中报告的错误)进行比较。

对于你的问题,你可以使用

 for column in df.select_dtypes(include=['whatever_type_you_want']):
    df[column], _ = pd.factorize(df[column])

select_dtypes 也可以接受 exclude 作为参数。

【讨论】:

  • 谢谢。调用列的适当方式是什么?
  • @J.DF 你必须删除 "": df06[column]
  • 谢谢。所以新的循环看起来像这样:for column in df_06: df_06[column].factorize
  • factorize 实际上返回两个值 (pandas.pydata.org/pandas-docs/stable/reference/api/…),因此您必须执行以下操作:for column in df: df[column], _ = pd.factorize(df[column]) 这将单独对每一列进行编码,不确定是否适合您。
  • 问题在于它也对整数值进行编码。这就是我使用 if df_06[column].values==object 的原因。另外,,_ 有什么作用?
【解决方案2】:

在编码之前,请确保您的列表示为category

df_06[list_of_columns_to_encode].apply(lambda col: col.astype('category'))
  1. 现在如果你想one-hot编码,为什么不直接使用pd.get_dummies呢?

    pd.get_dummies(df_06, columns=[list_of_columns_to_encode])
    
  2. 如果您想使用LabelEncoder,请尝试以下操作:

    le = LabelEncoder()
    df_06[list_of_columns_to_encode].apply(le.fit_transform)
    

    如果您想了解更多关于如何使用相同的LabelEncoder 拟合字典来transform 未来数据,请参阅this 答案。

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2021-05-13
    • 2016-11-28
    • 1970-01-01
    • 2019-07-10
    • 2014-04-03
    相关资源
    最近更新 更多