如何遍历CSV文件所有列计算氨基酸组成百分比?
解决CSV文件多列氨基酸组成百分比计算问题
问题描述
需要计算CSV文件中每一列的氨基酸组成百分比,但现有代码仅能处理第一列,无法遍历所有列并输出对应结果。
示例数据
Column header 95: A|T|E|A|A|Y|E|A|E|A Column header 96: W|I|Q|Q|A|L|P|K|E|A Column header 97: S|D|F|Q|G|Y|E|A|E|A
现有代码
import csv with open ('test.csv', 'r') as f: reader = csv.reader(f) column = [row[0] for row in reader] amino_acids = {} for aa in column: if aa in amino_acids: amino_acids[aa] += 1 else: amino_acids[aa] = 1 for aa, count in amino_acids.items(): #print(f'{aa}: {count}') percentage = count / len (column) *100 print (f"{aa}: {percentage: .2f}%")
预期输出
Column header 95: A: 50.00% E: 30.00% T: 10.00% Y: 10.00% Column header 96: A: 20.00% Q: 20.00% W: 10.00% I: 10.00% L: 10.00% P: 10.00% K: 10.00% E: 10.00% Column header 97: A: 20.00% E: 20.00% S: 10.00% D: 10.00% F: 10.00% Q: 10.00% G: 10.00% Y: 10.00%
解决方案
修改代码以遍历每一行(对应CSV中的每一列数据),拆分出列标题和氨基酸列表,再分别统计每列的氨基酸占比:
import csv from collections import Counter with open('test.csv', 'r') as f: reader = csv.reader(f) for row in reader: # 拆分列标题和氨基酸字符串,只拆分第一个冒号 header_part, aa_str = row[0].split(': ', 1) # 按|分割得到氨基酸列表 aa_list = aa_str.split('|') total = len(aa_list) # 统计每个氨基酸的数量 aa_counts = Counter(aa_list) # 输出列标题 print(f"{header_part}:") # 遍历统计结果,计算并输出百分比 for aa, count in aa_counts.items(): percentage = (count / total) * 100 print(f"{aa}: {percentage:.2f}%") # 空行分隔不同列的结果 print()
关键修改说明
- 遍历所有行:原代码只提取了所有行的第一个元素组成列表,现在改为逐行处理每一行数据(每行对应一列的氨基酸数据)。
- 拆分标题与氨基酸:使用
split(': ', 1)拆分每行内容,确保标题部分即使包含冒号也不会被错误分割。 - 简化统计逻辑:用
collections.Counter快速统计氨基酸出现次数,替代手动字典计数,代码更简洁高效。 - 按列计算百分比:针对每列的氨基酸总数计算百分比,修正了原代码用总行数计算的错误。
如果不想使用Counter,可以用手动字典计数替代:
# 替换Counter部分的代码 aa_counts = {} for aa in aa_list: if aa in aa_counts: aa_counts[aa] += 1 else: aa_counts[aa] = 1
内容的提问来源于stack exchange,提问作者user20578273
相关产品推荐
相关产品推荐

