【问题标题】:One hot encoding when a string is in column of dataframe当字符串在数据框列中时的一种热编码
【发布时间】:2019-08-03 08:04:17
【问题描述】:

我的数据框 df 有一列“amenities

例子:

amenities 0 {'TV','Wifi','Heater'} 1 {'Heater','Swimming Pool'} 2 {'Pet friendly','Heater'}

我需要执行一种热编码类型的操作,以便获得这样的新数据帧。

amenities   Heater  PF  SP  TV  Wifi
0   {'TV','Wifi','Heater'}  1   0   0   1   1
1   {'Heater','Swimming Pool'}  1   0   1   0   0
2   {'Pet friendly','Heater'}   1   1   0   0   0

最好与新列名匹配的字符串。我写 PF for Pet friendly 只是为了方便他人。

【问题讨论】:

    标签: pandas numpy dataframe lambda encoding


    【解决方案1】:

    如果列由字符串填充,请使用 Series.str.stripSeries.str.get_dummiesDataFrame.join 来添加原始列,如果需要,还可以使用 strip '' 从列名称中添加 rename

    df1 = (df['amenities'].str.strip('{}')
                          .str.get_dummies(',')
                          .rename(columns= lambda x: x.strip("'")))
    df2 = df[['amenities']].join(df1)
    

    如果被集合填充首先转换为字符串:

    df1 = (df['amenities'].astype(str)
                          .str.strip('{}')
                          .str.get_dummies(',')
                          .rename(columns= lambda x: x.strip("'")))
    

    或者使用MultiLabelBinarizer:

    from sklearn.preprocessing import MultiLabelBinarizer
    
    mlb = MultiLabelBinarizer()
    df1 = pd.DataFrame(mlb.fit_transform(df['amenities']),columns=mlb.classes_)
    

    df2 = df[['amenities']].join(df1)
    
    print (df2)
                        amenities  Heater  Pet friendly  Swimming Pool  TV  Wifi
    0      {'TV','Wifi','Heater'}       1             0              0   1     1
    1  {'Heater','Swimming Pool'}       1             0              1   0     0
    2   {'Pet friendly','Heater'}       1             1              0   0     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-08
      • 2020-08-12
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多