如何将CSV文件数据按col1分组并整理为指定列表格式?
CSV数据分组整理解决方案
原始CSV数据格式
col1 col2 col3 col4 ---- ---- ---- ---- a xy 11 66 a xz 11 66 b zz 99 33 b za 99 33
预期整理格式
list1 = [["a",["xy","xz"],11,66],["b",["zz","za"],99,33]]
已尝试的代码及问题
尝试1
with open(assignment_data_set) as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') for row in csv_reader: protein[row[0]].append(row[8]) protein[row[0]].append(row[5]) protein[row[0]].append(row[1])
结果:
['66', 'xy', '11', '66', 'xz', '11']
问题:col2未被分组,col3出现重复条目。
尝试2
with open(assignment_data_set) as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') for row in csv_reader: protein[row[0]].append(row[8]) for row in csv_reader: protein[row[0]].append(row[5]) protein[row[0]].append(row[1])
结果:
['66', '66']
问题:仅得到重复的col3数据。
尝试3
with open(assignment_data_set) as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') for row in csv_reader: protein[row[0]] = [row[0],row[8],row[1]] protein[row[0]].append(row[5])
结果:
['a', '66', '11', 'xy']
问题:col2的第二行条目'xz'缺失,预期应为['a', '66', '11', ['xy','xz']]
正确解决方案
用字典按col1分组,将col2收集为列表,同时记录同一分组下的col3和col4值(假设同一col1对应的col3、col4值一致):
import csv protein = {} with open('assignment_data_set.csv') as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') # 跳过表头和分隔线行 next(csv_reader) next(csv_reader) for row in csv_reader: # 注意:若你的CSV列索引与示例不同,自行替换row的索引值 key = row[0].strip() col2_val = row[1].strip() col3_val = int(row[2].strip()) col4_val = int(row[3].strip()) if key not in protein: # 初始化分组结构:[col1值, col2列表, col3值, col4值] protein[key] = [key, [col2_val], col3_val, col4_val] else: # 仅追加col2的新值到列表 protein[key][1].append(col2_val) # 转换为预期的列表格式 list1 = list(protein.values()) print(list1)
说明:
- 先跳过表头和分隔线行,避免处理无关数据
- 以col1的值为字典键,每个键对应的值是目标格式的子列表
- 首次遇到新的col1值时,初始化子列表结构
- 后续遇到相同col1值时,仅将col2的值追加到对应列表中
- 最后将字典的值转为列表,即可得到预期格式
若你的CSV列索引是之前代码中的row[0], row[5], row[1], row[8],只需替换对应索引:col2_val = row[5].strip()、col3_val = int(row[1].strip())、col4_val = int(row[8].strip())
内容的提问来源于stack exchange,提问作者user13849712
相关产品推荐
相关产品推荐

