如何将DataFrame中多列合并症值转换为以合并症为列名的二进制哑变量列
实现方案
方案1:宽转长后聚合(更灵活,推荐)
核心逻辑是先把多列合并症转为同一列的多行数据,再做独热编码后按主键聚合,适合需要过滤无效合并症取值的场景:
import pandas as pd # 匹配所有COMORBID开头的合并症列 comorbid_cols = [col for col in df.columns if col.startswith('COMORBID')] # 宽表转长表,丢弃空值行 melted_df = df.melt( id_vars='INC_KEY', value_vars=comorbid_cols, value_name='comorbid' ).dropna(subset=['comorbid']) # 可选:过滤不需要的合并症取值,比如示例中的Other # melted_df = melted_df[melted_df['comorbid'] != 'Other'] # 生成独热编码后按INC_KEY分组求和,出现过的合并症取值为1 comorbid_dummies = pd.get_dummies(melted_df['comorbid']) result = comorbid_dummies.groupby(melted_df['INC_KEY']).sum().reset_index() # 关联原表所有INC_KEY,补全无任何合并症的行,空值填0 result = df[['INC_KEY']].merge(result, on='INC_KEY', how='left').fillna(0).astype(int) # 可选:合并症列名统一转大写,匹配示例输出格式 result.columns = [col.upper() if col != 'INC_KEY' else col for col in result.columns]
方案2:直接合并get_dummies结果(代码更简洁)
基于你原本的pd.get_dummies思路,后续按合并症名称合并多列即可:
import pandas as pd comorbid_cols = [col for col in df.columns if col.startswith('COMORBID')] # 生成独热编码时去掉前缀,直接用合并症名称作为列名 dummies = pd.get_dummies(df[comorbid_cols], prefix='', prefix_sep='') # 按列名分组求和,把同一合并症在不同COMORBID列的结果合并 dummies = dummies.groupby(dummies.columns, axis=1).sum() # 可选:删除不需要的合并症列,比如Other # dummies = dummies.drop('OTHER', axis=1, errors='ignore') # 拼接主键列得到最终结果 result = pd.concat([df['INC_KEY'], dummies], axis=1) # 可选:列名转大写 result.columns = [col.upper() if col != 'INC_KEY' else col for col in result.columns]
两种方案最终输出的结果都符合要求的格式,性能上对于常规医疗数据量都没有问题。
内容的提问来源于stack exchange,提问作者Sean Roudnitsky
相关产品推荐
相关产品推荐

