如何用Python/Pandas基于列值标准化LOT_std列?
Pandas实现LOT_std列填充方案
步骤说明与代码实现
- 初始化数据:构造与你提供的表格一致的示例DataFrame
- 提取目标药物列表:从第一行Regimen中拆分出需要匹配的药物(排除后缀
Q21C) - 定义匹配条件:筛选出
Line of Therapy (LOT)为maintenance且Regimen包含至少一种目标药物的行 - 填充目标值:对符合条件的行,将
LOT_std设为第一行的LOT1
import pandas as pd # 构造原始表格数据 data = { 'Regimen': ['DrugA + DrugB + DrugC Q21C', 'DrugA', 'DrugA + DrugB', 'DrugA + DrugB + DrugC'], 'Line of Therapy (LOT)': ['LOT 1', 'maintenance', 'maintenance', 'maintenance'], 'LOT_std': ['LOT1', '', '', ''] } df = pd.DataFrame(data) # 提取第一行中的所有药物(去除Q21C后缀后拆分) first_regimen_drugs = df.loc[0, 'Regimen'].replace(' Q21C', '').split(' + ') # 构建筛选条件:LOT为maintenance,且Regimen包含至少一种目标药物 filter_condition = (df['Line of Therapy (LOT)'] == 'maintenance') & \ df['Regimen'].apply(lambda x: any(drug in x for drug in first_regimen_drugs)) # 对符合条件的行填充LOT_std值 df.loc[filter_condition, 'LOT_std'] = df.loc[0, 'LOT_std'] # 查看最终结果 print(df)
执行结果
运行代码后得到的表格如下:
| Regimen | Line of Therapy (LOT) | LOT_std | |
|---|---|---|---|
| 0 | DrugA + DrugB + DrugC Q21C | LOT 1 | LOT1 |
| 1 | DrugA | maintenance | LOT1 |
| 2 | DrugA + DrugB | maintenance | LOT1 |
| 3 | DrugA + DrugB + DrugC | maintenance | LOT1 |
扩展说明
如果第一行Regimen的后缀格式有变动(比如不是Q21C),可以调整字符串处理逻辑,比如用空格拆分取前半部分:
first_regimen_drugs = df.loc[0, 'Regimen'].split(' ')[0].split(' + ')
若药物名称存在歧义(比如DrugA和DrugAA),可以改用正则匹配完整药物名,避免误匹配:
import re def has_target_drug(regimen, drugs): for drug in drugs: if re.search(rf'\b{drug}\b', regimen): return True return False filter_condition = (df['Line of Therapy (LOT)'] == 'maintenance') & \ df['Regimen'].apply(lambda x: has_target_drug(x, first_regimen_drugs))
内容的提问来源于stack exchange,提问作者Sir
相关产品推荐
相关产品推荐

