python - 使用 one-hot 编码拆分字符串并将 df 从长格式转换为宽格式
问题描述
以下是相关 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_value
0 1 colour blue
1 1 interior_features cd_player<->sat_nav<->usb_port
2 2 colour red
3 2 interior_features cd_player<->usb_port
4 3 colour red
5 3 interior_features cd_player<->sat_nav<->sub_woofer
首先,我想将'interior_features'中的字符串转换 为一个列表,其中'<->'
是分隔符,如下所示:
id feature feature_value
0 1 colour blue
1 1 interior_features [cd_player, sat_nav, usb_port]
2 2 colour red
3 2 interior_features [cd_player, usb_port]
4 3 colour red
5 3 interior_features [cd_player, sat_nav, sub_woofer]
然后我想取消嵌套这个列表并使用单热编码将二进制值分配给“feature_value”列中的“interior_features” 。
预期的DF:
id feature feature_value
0 1 colour blue
1 1 cd_player 1
2 1 sat_nav 1
3 1 usb_port 1
4 1 sub_woofer 0
5 2 colour red
6 2 cd_player 1
7 2 sat_nav 0
8 2 usb_port 1
9 2 sub_woofer 0
10 3 colour red
11 3 cd_player 1
12 3 sat_nav 1
13 3 usb_port 0
14 3 sub_woofer 1
任何帮助将非常感激。
解决方案
您可以尝试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
推荐阅读
- python - 带有 CSV 对象的嵌套 for 循环的问题
- javascript - 用 google.script.run 替换 var
- python-3.x - 如何从列表中、字典中和基于键的列表中获取特定值
- spring - 在 Spring Security 中检查令牌的 NullPointerException
- java - 如何使用 Docker File 运行带有 Junit 测试的 Springboot 应用程序
- c# - 如何在应用程序关闭之前杀死所有正在运行的线程?
- nestjs - 使用 NestJS 向响应添加状态
- python - 当我在烧瓶中调用函数时,语音识别不起作用
- powershell - 安装NewSSHSession离线服务器-powershell
- vue.js - VueJs:根据条件禁用特定日期之前的所有日期