使用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
相关产品推荐
相关产品推荐

