Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn LabelEncoder中的标签不一致?_Python_Pandas_Scikit Learn - Fatal编程技术网

Python sklearn LabelEncoder中的标签不一致?

Python sklearn LabelEncoder中的标签不一致?,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,我在数据帧上应用了一个LabelEncoder(),它返回以下内容: encoder = LabelEncoder() all_values = String_df.values.ravel() #convert the dataframe to one long array encoder.fit(all_values) labeled_df = String_df.apply(encoder.transform) order/new\u carts具有不同的标签编码编号,如70、64、7

我在数据帧上应用了一个
LabelEncoder()
,它返回以下内容:

encoder = LabelEncoder()
all_values = String_df.values.ravel() #convert the dataframe to one long array
encoder.fit(all_values)
labeled_df = String_df.apply(encoder.transform)

order/new\u cart
s具有不同的标签编码编号,如
70、64、71等


这是不一致的标签,还是我在某个地方做错了什么?

LabelEncoder适用于一维数组。如果将其应用于多个列,则它将在列内保持一致,但不会跨列保持一致

作为一种解决方法,您可以将数据帧转换为一维数组,并在该数组上调用LabelEncoder

假设这是数据帧:

df
Out[372]: 
   0  1  2
0  d  d  a
1  c  a  c
2  c  c  b
3  e  e  d
4  d  d  e
5  d  b  e
6  e  e  b
7  a  e  b
8  b  c  c
9  e  a  b
使用ravel,然后进行重塑:

pd.DataFrame(LabelEncoder().fit_transform(df.values.ravel()).reshape(df.shape), columns = df.columns)
Out[373]: 
   0  1  2
0  3  3  0
1  2  0  2
2  2  2  1
3  4  4  3
4  3  3  4
5  3  1  4
6  4  4  1
7  0  4  1
8  1  2  2
9  4  0  1
编辑:

如果要存储标签,则需要保存LabelEncoder对象

le = LabelEncoder()
df2 = pd.DataFrame(le.fit_transform(df.values.ravel()).reshape(df.shape), columns = df.columns)
现在,
le.classes\uu
为您提供类(从0开始)

如果要按标签访问整数,可以构造dict:

dict(zip(le.classes_, np.arange(len(le.classes_))))
Out[388]: {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}
您可以使用transform方法执行相同的操作,而无需构建dict:

le.transform('c')
Out[395]: 2
您的对象正在重新适应数据帧的每一列。 由于and函数的工作方式,您无意中在框架的每一列上调用了fit函数。让我们看一下下面这行发生了什么:

labeled_df = String_df.apply(LabelEncoder().fit_transform)
  • 创建一个新的
    LabelEncoder
    对象
  • 调用
    apply
    传入
    fit\u transform
    方法。对于
    DataFrame
    中的每一列,它将调用编码器上的
    fit\u transform
    ,并将该列作为参数传入。这有两件事:
    A.重新安装编码器(修改其状态) B.根据编码器和新配件返回列元素的代码
  • 代码在列之间不一致,因为每次调用fit_transform时,LabelEncoder对象都可以选择新的转换代码

    如果希望代码在列之间保持一致,则应将LabelEncoder与整个数据集相匹配。 然后将变换函数传递给应用函数,而不是fit_变换函数。您可以尝试以下操作:

    encoder = LabelEncoder()
    all_values = String_df.values.ravel() #convert the dataframe to one long array
    encoder.fit(all_values)
    labeled_df = String_df.apply(encoder.transform)
    

    谢谢你的回答。有什么方法可以得到字符串的映射和它对应的编码标签吗?喜欢
    订单/新购物车,非常感谢。但是,
    le.classes\uu
    返回以下错误:
    AttributeError:'LabelEncoder'对象没有属性'classes'
    ,这是我的错误,抱歉。分配
    le=LabelEncoder
    后,需要对该对象调用fit\u transform。请再次查看以“编辑”开头的零件。