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

Python中拆分多值列后生成含Yes/No标记新列的实现方法咨询

Python中拆分多值列后生成含Yes/No标记新列的实现方法咨询

嘿,我看了你遇到的问题啦——把包含多个疾病的列拆分成单独的Yes/No标记列,其实不用你之前那种先拆分再处理的复杂方式,pandas里有个专门的工具可以一步搞定,超级方便!

首先,你之前用str.split()再concat的方法会生成一堆零散的列,还要处理None值,确实有点麻烦。推荐你试试str.get_dummies()这个方法,它专门用来处理这种用分隔符分隔的多值列,直接生成每个类别对应的哑变量(0/1),然后我们再把0/1转换成你想要的Yes/No就行。

给你一步步演示怎么操作:

1. 先构造你的示例数据(方便你测试)

import pandas as pd

# 你的原始数据
data = {
    'sampleID': ['P01', 'P02', 'P03', 'P04', 'P05'],
    'comorbidities': ['hypertension, diabetes', 'hypertension, diabetes', 'diabetes', 'CHD, asthma', 'asthma, hypertension']
}
df = pd.DataFrame(data)

2. 生成疾病的哑变量列

这里要注意你的分隔符是逗号加空格(, ),所以一定要在get_dummies里指定sep=', ',避免生成带空格的列名:

# 生成每个疾病的0/1标记列
disease_dummies = df['comorbidities'].str.get_dummies(sep=', ')

这一步执行完,你会得到一个新的DataFrame,列名是所有出现过的疾病,每行对应0(没有该疾病)或1(有该疾病)。

3. 把0/1转换成Yes/No

如果你想要的是Yes/No而不是数字标记,用replace方法批量替换就行:

disease_dummies = disease_dummies.replace({1: 'yes', 0: 'no'})

4. 合并到原始DataFrame

最后把生成的标记列和你的原始数据合并起来:

final_df = pd.concat([df, disease_dummies], axis=1)

最终结果

执行完上面的步骤,final_df就完全是你想要的格式了:

sampleIDcomorbiditieshypertensiondiabetesCHDasthma
P01hypertension, diabetesyesyesnono
P02hypertension, diabetesyesyesnono
P03diabetesnoyesnono
P04CHD, asthmanonoyesyes
P05asthma, hypertensionyesnonoyes

额外小提示

如果你的原始数据里有格式不规范的情况(比如有的地方是逗号无空格,有的是逗号加空格),可以先预处理一下,统一格式:

# 先把所有分隔符换成逗号,再去掉每个疾病名称的空格,最后重新用逗号加空格连接
df['comorbidities'] = df['comorbidities'].str.replace(', ', ',').str.split(',').apply(lambda x: [s.strip() for s in x]).str.join(', ')

这样能确保get_dummies正确识别所有疾病类别。

这个方法比你之前尝试的groupby或者拆分后处理要高效得多,pandas的这类内置方法就是专门用来解决这类数据清洗问题的,以后遇到类似的多值列拆分需求都可以用它~

备注:内容来源于stack exchange,提问作者Dana Yang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:47:40