首页 > 解决方案 > 当字符串在数据框列中时的一种热编码

问题描述

amenities我的数据框有一列“ ”df

在此处输入图像描述

例子:

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 只是为了方便他人。

在此处输入图像描述

标签: pandasnumpydataframelambdaencoding

解决方案


如果列由字符串填充,则使用Series.str.stripwithSeries.str.get_dummiesDataFrame.joinfor 添加原始列,如果需要,还可以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

推荐阅读