在 scikitlearn 中为系列使用 LabelEncoder

Sah*_*hil 4 python machine-learning pandas scikit-learn

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

from sklearn.preprocessing import LabelEncoder
m = hsp_train["Alley"]
m_enc = LabelEncoder()
j = m_enc.fit_transform(m)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

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

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

我也试过这个:

l = hsp_train["Alley"]
l_enc = pd.factorize(l)
hsp_train["Alley"] = l_enc[0]
Run Code Online (Sandbox Code Playgroud)

但这给了我值 -1, 1, 2. 我不想要它从 1 开始。

Nic*_*eli 5

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

插图:

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

使用LabelEncoder编码的分类标签:

enc = LabelEncoder()
enc.fit_transform(df['Categorical'])
Run Code Online (Sandbox Code Playgroud)

给出:

类型错误:无法排序的类型:float() > str()

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

pd.factorize(df['Categorical'])[0]
array([ 0,  1,  0,  2,  1,  0,  2, -1])
Run Code Online (Sandbox Code Playgroud)

如果您不希望NAN识别值并将它们视为任何字符串,您可以在读取过程中使用na_filter

df = pd.read_csv(data, na_filter=False, ...)
Run Code Online (Sandbox Code Playgroud)

它还大大提高了读取相对较大文件的性能。


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

df.fillna('Na', inplace=True)
Run Code Online (Sandbox Code Playgroud)

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