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

使用Python处理CSV:按Adverse Effects关联对应Drug Name生成新表

CSV数据转换:按不良反应关联药物的代码修正

需求说明

我有一个大型CSV文件,其中**B列(表头为Drug Name)**是药物名称,**D列(表头为Adverse Effects)**是该药物的所有不良反应,每行对应一种药物及其全部不良反应。需要将数据转换为按不良反应分类的结构:提取所有唯一的不良反应,关联出现该反应的所有药物,生成名为drugResults的新表。

原代码问题排查

原代码存在以下几个核心问题导致运行异常:

  • 未初始化csv.writer/csv.DictWriter对象,直接调用writer.writeheader()会触发NameError
  • 输出表头逻辑错误:将每个不良反应作为列名,不符合"按不良反应分类"的需求(正确表头应为Adverse Effect和Drug Names)
  • 未处理空的不良反应条目,会生成无效的空字符串键
  • 不良反应字符串清理不彻底,可能因前缀符号/空格导致重复键

修正后的完整代码

import csv

unique_adverse_effects = {}

# 读取原始CSV文件
with open('AntiDepressants.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile)
    
    for row in reader:
        drug_name = row['Drug Name'].strip()
        # 处理不良反应列可能为空的情况
        adverse_effects_raw = row.get('Adverse Effects', '')
        if not adverse_effects_raw:
            continue
            
        adverse_effects = adverse_effects_raw.lower()
        # 拆分不良反应列表,兼容换行分隔的格式(可根据实际分隔符调整)
        effects_list = adverse_effects.split('\n')
        
        for effect in effects_list:
            # 清理字符串:去除首尾空白、前缀的-/*等符号,避免重复键
            effect_clean = effect.strip().lstrip('-* ')
            # 过滤空的不良反应条目
            if not effect_clean:
                continue
                
            # 关联药物与不良反应,避免重复添加同一药物
            if effect_clean not in unique_adverse_effects:
                unique_adverse_effects[effect_clean] = [drug_name]
            elif drug_name not in unique_adverse_effects[effect_clean]:
                unique_adverse_effects[effect_clean].append(drug_name)

# 生成需求的drugResults.csv文件
with open('drugResults.csv', 'w', newline='', encoding='utf-8') as csvfile:
    # 定义标准输出表头
    fieldnames = ['Adverse Effect', 'Drug Names']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    writer.writeheader()
    
    # 遍历写入每个不良反应及其关联药物
    for effect, drugs in unique_adverse_effects.items():
        writer.writerow({
            'Adverse Effect': effect.title(),
            'Drug Names': '\n'.join(drugs)  # 若需逗号分隔,替换为', '.join(drugs)
        })

关键修正说明

  • 初始化csv.DictWriter并指定正确的双列表头,解决未定义writer的报错
  • 增加空不良反应条目过滤,避免无效数据写入
  • 优化字符串清理逻辑,兼容更多前缀符号,减少重复键的生成
  • 处理药物名称的首尾空白,避免因空格导致的重复识别
  • 输出文件名调整为需求中的drugResults.csv
  • 可灵活调整药物名称的分隔方式(换行/逗号),适配不同展示需求

内容的提问来源于stack exchange,提问作者pythonpaul007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:02:47