【问题标题】:Running get_dummies on several DataFrame columns?在几个 DataFrame 列上运行 get_dummies?
【发布时间】:2014-07-29 08:58:01
【问题描述】:

如何在多个 DataFrame 列上惯用地运行像 get_dummies 这样的函数,它需要一个列并返回多个列?

【问题讨论】:

    标签: python pandas dataframe one-hot-encoding


    【解决方案1】:

    使用 pandas 0.19,您可以在一行中完成:

    pd.get_dummies(data=df, columns=['A', 'B'])
    

    Columns 指定在哪里进行 One Hot Encoding。

    >>> df
       A  B  C
    0  a  c  1
    1  b  c  2
    2  a  b  3
    
    >>> pd.get_dummies(data=df, columns=['A', 'B'])
       C  A_a  A_b  B_b  B_c
    0  1  1.0  0.0  0.0  1.0
    1  2  0.0  1.0  0.0  1.0
    2  3  1.0  0.0  1.0  0.0
    

    【讨论】:

      【解决方案2】:

      由于pandas 0.15.0版,pd.get_dummies可以直接处理DataFrame(在此之前,它只能处理单个Series,解决方法见下文):

      In [1]: df = DataFrame({'A': ['a', 'b', 'a'], 'B': ['c', 'c', 'b'],
         ...:                 'C': [1, 2, 3]})
      
      In [2]: df
      Out[2]:
         A  B  C
      0  a  c  1
      1  b  c  2
      2  a  b  3
      
      In [3]: pd.get_dummies(df)
      Out[3]:
         C  A_a  A_b  B_b  B_c
      0  1    1    0    0    1
      1  2    0    1    0    1
      2  3    1    0    1    0
      

      pandas 的解决方法

      您可以对每列单独执行此操作,然后将结果连接起来:

      In [111]: df
      Out[111]: 
         A  B
      0  a  x
      1  a  y
      2  b  z
      3  b  x
      4  c  x
      5  a  y
      6  b  y
      7  c  z
      
      In [112]: pd.concat([pd.get_dummies(df[col]) for col in df], axis=1, keys=df.columns)
      Out[112]: 
         A        B      
         a  b  c  x  y  z
      0  1  0  0  1  0  0
      1  1  0  0  0  1  0
      2  0  1  0  0  0  1
      3  0  1  0  1  0  0
      4  0  0  1  1  0  0
      5  1  0  0  0  1  0
      6  0  1  0  0  1  0
      7  0  0  1  0  0  1
      

      如果您不想要多索引列,请从 concat 函数调用中删除 keys=..

      【讨论】:

      • 很好,我喜欢多索引列。
      【解决方案3】:

      有人可能有更聪明的方法,但这里有两种方法。假设您有一个名为 df 的数据框,其中包含您想要假人的“名称”和“年份”列。

      首先,简单地遍历列并不算太糟糕:

      In [93]: for column in ['Name', 'Year']:
          ...:     dummies = pd.get_dummies(df[column])
          ...:     df[dummies.columns] = dummies
      

      另一个想法是使用patsy 包,该包旨在从 R 型公式构造数据矩阵。

      In [94]: patsy.dmatrix(' ~ C(Name) + C(Year)', df, return_type="dataframe")
      

      【讨论】:

        【解决方案4】:

        除非我不明白这个问题,否则 get_dummies 通过传递 columns 参数来原生支持它。

        【讨论】:

        • 您不需要指定columns 参数。默认情况下,它将编码所有类似分类的列(字符串/分类)
        • 是的,我假设@Emre 想控制哪些列被虚拟化。
        【解决方案5】:

        我目前使用的简单技巧是 for 循环。 首先使用select_dtypes(include="object")将分类数据从数据框中分离出来, 然后通过使用 for 循环将get_dummies 迭代地应用于每一列 正如我在下面的代码中所示:

        train_cate=train_data.select_dtypes(include="object")
        test_cate=test_data.select_dtypes(include="object")
        # vectorize catagorical data
        for col in train_cate:
            cate1=pd.get_dummies(train_cate[col])
            train_cate[cate1.columns]=cate1
            cate2=pd.get_dummies(test_cate[col])
            test_cate[cate2.columns]=cate2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-21
          • 2012-11-23
          • 2023-03-05
          • 1970-01-01
          • 2015-02-02
          相关资源
          最近更新 更多