想知道pd.factorize,pd.get_dummies,sklearn.preprocessing.LableEncoder和OneHotEncoder之间的区别。 - python

Improve this question

这四个功能似乎真的与我相似。在某些情况下,其中一些可能会给出相同的结果,而有些则不会。任何帮助将不胜感激!

现在我知道了,并且我认为factorizeLabelEncoder在内部是相同的,并且在结果方面没有太大的区别。我不确定它们是否会在大量数据上占用相似的时间。
get_dummiesOneHotEncoder将产生相同的结果,但是OneHotEncoder只能处理数字,但是get_dummies将接受各种输入。 get_dummies将为每个列输入自动生成新的列名,但是OneHotEncoder不会(它将分配新的列名1,2,3 ....)。所以get_dummies在所有方面都更好。

如果我错了,请纠正我!谢谢!

参考方案

这四种编码器可以分为两类:

  • 标签编码为分类变量:熊猫factorize和scikit-learn LabelEncoder。结果将具有1维。
  • 分类变量编码为虚拟变量/指标(二进制)变量:熊猫get_dummies和scikit-learn OneHotEncoder。结果将具有n个维,一个维是编码的分类变量的不同值。
  • 熊猫和scikit-learn编码器之间的主要区别在于,已通过fittransform方法将scikit-learn编码器用于 scikit-learn管道

    将标签编码为分类变量

    熊猫factorize和scikit-learn LabelEncoder属于第一类。它们可用于创建分类变量,例如将字符转换为数字。

    from sklearn import preprocessing    
    # Test data
    df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])    
    df['Fact'] = pd.factorize(df['Col'])[0]
    le = preprocessing.LabelEncoder()
    df['Lab'] = le.fit_transform(df['Col'])
    
    print(df)
    #   Col  Fact  Lab
    # 0   A     0    0
    # 1   B     1    1
    # 2   B     1    1
    # 3   C     2    2
    

    将分类变量编码为虚拟/指标(二进制)变量

    熊猫get_dummies和scikit-learn OneHotEncoder属于第二类。它们可用于创建二进制变量。 OneHotEncoder仅可与分类整数一起使用,而get_dummies可与其他类型的变量一起使用。

    df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
    df = pd.get_dummies(df)
    
    print(df)
    #    Col_A  Col_B  Col_C
    # 0    1.0    0.0    0.0
    # 1    0.0    1.0    0.0
    # 2    0.0    1.0    0.0
    # 3    0.0    0.0    1.0
    
    from sklearn.preprocessing import OneHotEncoder, LabelEncoder
    df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
    # We need to transform first character into integer in order to use the OneHotEncoder
    le = preprocessing.LabelEncoder()
    df['Col'] = le.fit_transform(df['Col'])
    enc = OneHotEncoder()
    df = DataFrame(enc.fit_transform(df).toarray())
    
    print(df)
    #      0    1    2
    # 0  1.0  0.0  0.0
    # 1  0.0  1.0  0.0
    # 2  0.0  1.0  0.0
    # 3  0.0  0.0  1.0
    

    我还根据此答案写了更详细的post。

    .get()之后,多处理陷入困境 - python

    我试图了解multiprocessing如何在python中工作并遇到一些问题。这是示例:import multiprocessing def func(): return 1 p = multiprocessing.Pool() result = p.apply_async(func).get() 调用.get()函数时,代码只是卡住了。我究竟做错了什么?…

    通过参数传递异步循环或使用默认异步循环 - python

    我在我的应用程序中使用asyncio,我有点困惑将事件循环作为参数传递。使用事件循环编写函数/方法时,有三种可能性:将异步事件循环作为参数传递不要在事件循环中使用参数,而应使用asyncio.get_event_loop() 使其可选,以将事件循环作为参数传递。如果未通过,请使用asyncio.get_event_loop() 似乎大多数情况下都使用最后一种…

    Flask-从request.get_json()获取键值 - python

    我试图从ajax POST请求json数据后获取键值。我成功检索了数据,但是出现错误:“ AttributeError:'unicode'对象没有属性'keys'”。我曾尝试使用json.load(data),但这也没有成功。@app.route('/sendstats', methods=['GET', '…

    在Ubuntu上安装psycopg2 - python

    我正在尝试在Ubuntu 12.04上安装python postgres客户端模块。该指南将执行以下操作:apt-get install python-psycopg2 但是,apt表示无法找到该软件包。我渴望通过apt安装它。这是我可以安装的另一个软件包的一部分吗? 参考方案 使用Ubuntu 12.04似乎对我来说很好:jon@minerva:~$ su…

    Django隐藏重定向 - python

    我想为应用内重定向创建一种机制,该机制不会完全重定向,而只是加载另一个视图函数。假设我要进行localhost:8000/a,django渲染视图,视图的最后一行说return HttpResponseRedirect('/b') 因此,现在我的浏览器将转到localhost:8000/b,django将呈现视图并将其返回给我。现在,我只…