代码之家  ›  专栏  ›  技术社区  ›  2D_

使用pandas或scikit learn在多维数组上进行一次热编码

  •  3
  • 2D_  · 技术社区  · 7 年前

    我正在尝试为我的数据帧编码一个热点。这是一个多维数组,我不知道怎么做。数据帧可能如下所示:

    df = pd.DataFrame({'menu': [['Italian', 'Greek'], ['Japanese'], ['Italian','Greek', 'Japanese']], 'price': ['$$', '$$', '$'], 'location': [['NY', 'CA','MI'], 'CA', ['NY', 'CA','MA']]})
    

    enter image description here

    我想要的输出如下:

    df2 = pd.DataFrame({'menu': [[1,1,0], [0,0,1], [1,1,1]], 'price': [[1,0], [1,0], [0,1]], 'location': [[1,1,1,0], [0,1,0,0], [1,1,0,1]]})
    

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  4
  •   jezrael    7 年前

    您可以使用:

    #create list with one item values
    df = df.applymap(lambda x: x if isinstance(x, list) else [x])
    print (df)
           location                        menu price
    0  [NY, CA, MI]            [Italian, Greek]  [$$]
    1          [CA]                  [Japanese]  [$$]
    2  [NY, CA, MA]  [Italian, Greek, Japanese]   [$]
    
    from sklearn.preprocessing import MultiLabelBinarizer
    
    mlb = MultiLabelBinarizer()
    #create Series for each column by list comprehension
    vals = [pd.Series(mlb.fit_transform(df[x]).tolist()) for x in df.columns]
    #concat to df
    df2 = pd.concat(vals, keys=df.columns, axis=1)
    print (df2)
    
           location       menu   price
    0  [1, 0, 1, 1]  [1, 1, 0]  [0, 1]
    1  [1, 0, 0, 0]  [0, 0, 1]  [0, 1]
    2  [1, 1, 0, 1]  [1, 1, 1]  [1, 0]