使用Pandas结构化临床试验数据适配机器学习模型:格式转换难题求助
临床试验数据重塑方案(适配机器学习)
1. 正确合并多表(避免数据膨胀)
之前用.join()导致数据激增,是因为未指定唯一连接键引发笛卡尔积。需通过PatientID和Week双字段内连接,确保仅保留三表共有的患者-周数据:
import pandas as pd # 假设已读取三个表为df1、df2、df3 merged_df = pd.merge(df1, df2, on=['PatientID', 'Week'], how='inner') merged_df = pd.merge(merged_df, df3, on=['PatientID', 'Week'], how='inner')
2. 重塑为目标结构(行=临床数据项,列=患者)
通过「转长→组合标签→转宽」三步实现,替代嵌套索引的复杂操作:
# 1. 将宽表转长:提取PatientID/Week作为标识,其余字段转为指标-值对 melted_df = merged_df.melt( id_vars=['PatientID', 'Week'], var_name='Metric', value_name='Value' ) # 2. 生成行标签:拼接Week与指标名(如Week1 Medication) melted_df['Row_Label'] = 'Week' + melted_df['Week'].astype(str) + ' ' + melted_df['Metric'] # 3. 转宽为目标格式:行=Row_Label,列=PatientID,值=对应数据 final_df = melted_df.pivot(index='Row_Label', columns='PatientID', values='Value')
3. 批量处理NaN值
针对不同类型字段采用针对性填充策略:
# 数值型字段(MG_dose、Test 1、Test 2):用患者自身均值填充 numeric_metrics = ['MG_dose', 'Test 1', 'Test 2'] numeric_rows = final_df.index.str.contains('|'.join(numeric_metrics)) final_df.loc[numeric_rows] = final_df.loc[numeric_rows].apply(lambda x: x.fillna(x.mean()), axis=1) # 分类型字段(Medication、Survey Q1、Survey Q2):用患者自身众数填充 categorical_metrics = ['Medication', 'Survey Q1', 'Survey Q2'] categorical_rows = final_df.index.str.contains('|'.join(categorical_metrics)) final_df.loc[categorical_rows] = final_df.loc[categorical_rows].apply( lambda x: x.fillna(x.mode()[0]) if not x.mode().empty else x, axis=1 )
4. 为什么不用循环?
Pandas的矢量化操作(melt/pivot)比循环效率高10~100倍,尤其针对1300名患者的数据集,能避免手动映射的冗余代码与错误。
内容的提问来源于stack exchange,提问作者Dan Herman
相关产品推荐
相关产品推荐

