我有一个数据集中的列,包含分类值,我希望将它们转换为数值。我尝试使用LabelEncoder,但这样做时遇到了错误。
from sklearn.preprocessing import LabelEncoderm = hsp_train["Alley"]m_enc = LabelEncoder()j = m_enc.fit_transform(m)
我得到的错误是:
unorderable types: 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开始,而不是这样。
回答:
很明显,你的系列中存在缺失值。如果你想从你的系列中删除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: unorderable types: 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”,然后你可以继续之前的操作。