You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含竖线分隔多值列的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:59:06