【问题标题】:Using LabelEncoder for a series in scikitlearn在 scikit learn 中使用 LabelEncoder 进行系列
【发布时间】:2017-01-22 11:16:53
【问题描述】:

我在数据集中有一列具有分类值,我想将它们转换为数值。我正在尝试使用 LabelEncoder,但这样做会出错。

from sklearn.preprocessing import LabelEncoder
m = hsp_train["Alley"]
m_enc = LabelEncoder()
j = m_enc.fit_transform(m)

我收到一个错误:

不可排序的类型:float() > str()

列中的系列有 3 个值。我希望它们分别为 0、1、2,但我得到了那个错误。

我也试过这个:

l = hsp_train["Alley"]
l_enc = pd.factorize(l)
hsp_train["Alley"] = l_enc[0]

但这给了我值 -1、1、2。我不想从 1 得到它。

【问题讨论】:

  • 据我所知,OneHotEncoder 对我认为的整数很有用,而 pandas.get_dummies 会增加我不想要的列数。

标签: python pandas machine-learning scikit-learn


【解决方案1】:

很明显,您的系列中缺少值。如果您想从您的系列中删除 NaN 值,只需执行 hsp_train["Alley"].dropna()

插图:

df = pd.DataFrame({'Categorical': ['apple', 'mango', 'apple', 
                                   'orange', 'mango', 'apple', 
                                   'orange', np.NaN]})

使用LabelEncoder 对分类标签进行编码:

enc = LabelEncoder()
enc.fit_transform(df['Categorical'])

给予:

TypeError:不可排序的类型:float() > str()

默认情况下,pd.factorize 会自动将 -1 分配给缺失值,因此您会得到这些值:

pd.factorize(df['Categorical'])[0]
array([ 0,  1,  0,  2,  1,  0,  2, -1])

如果您不想识别NAN 值并将它们视为任何字符串,您可以在使用na_filter 读取过程时执行此操作:

df = pd.read_csv(data, na_filter=False, ...)

它还极大地提高了读取较大文件的性能。


或者,您可以使用 fillna 将所有 NaN 值填充到您选择的所需字符串中:

df.fillna('Na', inplace=True)

这会将所有NaN 值替换为您的字符串值“Na”,您可以像以前一样继续。

【讨论】:

  • 感谢@Nickil 的解释,但如果我希望将实际上是描述为“Na”的类别的缺失值(熊猫将其视为 NaN 值)作为第三类呢?
猜你喜欢
  • 2016-11-24
  • 2019-06-28
  • 2018-08-02
  • 2016-03-17
  • 2018-02-27
  • 2020-10-24
  • 2015-08-01
  • 2017-05-09
  • 2015-02-04
相关资源
最近更新 更多