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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:56:25