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就完全是你想要的格式了:
| sampleID | comorbidities | hypertension | diabetes | CHD | asthma |
|---|---|---|---|---|---|
| P01 | hypertension, diabetes | yes | yes | no | no |
| P02 | hypertension, diabetes | yes | yes | no | no |
| P03 | diabetes | no | yes | no | no |
| P04 | CHD, asthma | no | no | yes | yes |
| P05 | asthma, hypertension | yes | no | no | yes |
额外小提示
如果你的原始数据里有格式不规范的情况(比如有的地方是逗号无空格,有的是逗号加空格),可以先预处理一下,统一格式:
# 先把所有分隔符换成逗号,再去掉每个疾病名称的空格,最后重新用逗号加空格连接 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
相关产品推荐
相关产品推荐

