为了账号安全,请及时绑定邮箱和手机立即绑定

使用 one-hot 编码分割字符串并将 df 从长格式转换为宽格式

使用 one-hot 编码分割字符串并将 df 从长格式转换为宽格式

开满天机 2023-07-11 14:45:25
以下是相关 df 的简化版本的脚本:df = pd.DataFrame({                'id' : [1,1,2,2,3,3],                'feature': ['colour','interior_features','colour','interior_features','colour','interior_features'],               'feature_value' : ['blue','cd_player<->sat_nav<->usb_port','red','cd_player<->usb_port','red','cd_player<->sat_nav<->sub_woofer'],                 })df   id   feature             feature_value0   1   colour              blue1   1   interior_features   cd_player<->sat_nav<->usb_port2   2   colour              red3   2   interior_features   cd_player<->usb_port4   3   colour              red5   3   interior_features   cd_player<->sat_nav<->sub_woofer首先,我想将'interior_features'中的字符串转换 为一个列表,其中'<->'是分隔符,如下所示:    id  feature             feature_value0   1   colour              blue1   1   interior_features   [cd_player, sat_nav, usb_port]2   2   colour              red3   2   interior_features   [cd_player, usb_port]4   3   colour              red5   3   interior_features   [cd_player, sat_nav, sub_woofer]然后我想取消该列表的嵌套,并使用 one-hot 编码将二进制值分配给“feature_value”列中的“interior_features”。预期DF:    id  feature     feature_value0   1   colour      blue1   1   cd_player   12   1   sat_nav     13   1   usb_port    14   1   sub_woofer  05   2   colour      red6   2   cd_player   17   2   sat_nav     08   2   usb_port    19   2   sub_woofer  010  3   colour      red11  3   cd_player   112  3   sat_nav     113  3   usb_port    014  3   sub_woofer  1任何帮助将非常感激。
查看完整描述

1 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

split然后您可以尝试explode填充crosstab每个 id 的缺失行


df1 = df.loc[df['feature']=='colour'] 

# slice out the row do not need to unnest

df2 = df.drop(df1.index)    

df2['feature'] = df2['feature_value'].str.split('<->')

s = df2.explode('feature') 

s = pd.crosstab(s['id'],s['feature']).stack().reset_index(name='feature_value')

out = pd.concat([df1,s]).sort_values('id')

out

Out[356]: 

    id     feature feature_value

0    1      colour          blue

0    1   cd_player             1

1    1     sat_nav             1

2    1  sub_woofer             0

3    1    usb_port             1

2    2      colour           red

4    2   cd_player             1

5    2     sat_nav             0

6    2  sub_woofer             0

7    2    usb_port             1

4    3      colour           red

8    3   cd_player             1

9    3     sat_nav             1

10   3  sub_woofer             1

11   3    usb_port             0


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信