如何将含竖线分隔多值列的DataFrame转换为yes/no标记的宽表?
解决方案
没问题,这个需求用Pandas就能轻松搞定,核心思路是拆分多值列后做独热编码,再调整格式和列名就行。下面是完整的可运行代码,我还会一步步拆解逻辑:
import pandas as pd # 先创建你给出的原始DataFrame df = pd.DataFrame({ 'id': [1110, 1123, 1245, 1710, 1109], 'fruits': ['banana|grapes|pine apple', 'apple|orange|pine apple', 'apple|grapes', 'banana|orange|pine apple', 'banana|apple|pine apple'], 'fastfoods': ['noodles|manchurian', 'friedrice|manchurian', 'noodles|fried rice', 'noodles|manchurian', 'manchurian'] }) # 处理fruits列:拆分、去空格、独热编码 fruits_dummies = df['fruits'].str.split('|', expand=True).stack().str.strip().str.get_dummies().sum(level=0) # 处理fastfoods列:同样操作 fastfoods_dummies = df['fastfoods'].str.split('|', expand=True).stack().str.strip().str.get_dummies().sum(level=0) # 合并id列和两个编码后的DataFrame result = pd.concat([df['id'], fruits_dummies, fastfoods_dummies], axis=1) # 调整列名(把带空格的改成驼峰式,统一相似值) result = result.rename(columns={ 'pine apple': 'pineApple', 'fried rice': 'friedRice', 'friedrice': 'friedRice' # 统一原始数据里的"friedrice"和"fried rice" }) # 将1替换成yes,0替换成no result = result.replace({1: 'yes', 0: 'no'}) # 调整列顺序,和目标格式完全匹配 desired_order = ['id', 'banana', 'grapes', 'pineApple', 'apple', 'orange', 'noodles', 'manchurian', 'friedRice'] result = result[desired_order] print(result)
步骤拆解
- 拆分与清洗:用
str.split('|')把每个单元格的多值拆分成独立元素,再用str.strip()去掉元素前后的空格(比如处理"pine apple"里的空格,避免列名带空格)。 - 独热编码:
str.get_dummies()会自动把每个唯一值生成新列,出现过的标记为1,未出现的为0;sum(level=0)是把拆分后分散到多行的同一原始行数据聚合回来。 - 合并与列名统一:把原始id列和编码后的两部分数据合并,同时把带空格的列名改成你要的驼峰式,还统一了原始数据里拼写不一致的"friedrice"和"fried rice"。
- 格式调整:把数字1/0替换成"yes"/"no",最后调整列顺序和你给出的目标格式完全一致。
运行代码后就能得到你想要的DataFrame啦!
内容的提问来源于stack exchange,提问作者iammdi
相关产品推荐
相关产品推荐

