Python实现CSV列匹配合并:按Serial分组关联Material
解决你的CSV分组拼接需求(Python新手友好版)
嘿,作为Python新手能迈出第一步已经很棒啦!你的需求是把同Serial组的Material用///拼起来,放到每组所有行的Related列,最多取5个值对吧?我来帮你完善代码,一步步实现这个功能:
思路拆解
- 先把CSV里的所有数据读进来,按
Serial分组,收集每组的Material列表(限制最多5个) - 再遍历每一行数据,给当前行的
Related列填充对应组的拼接字符串 - 最后把处理好的数据写入新的CSV文件
完整代码实现
import csv # 第一步:读取原始CSV,按Serial分组收集Material grouped_materials = {} with open('EGLOINDOORCSV.csv', mode='r', encoding='utf-8') as infile: # 用DictReader可以直接通过列名访问数据,不用记索引,更适合新手 reader = csv.DictReader(infile) for row in reader: serial = row['Serial'] material = row['Material'] # 如果这个Serial组还没创建,就初始化一个空列表 if serial not in grouped_materials: grouped_materials[serial] = [] # 最多添加5个Material到组里 if len(grouped_materials[serial]) < 5: grouped_materials[serial].append(material) # 第二步:处理每一行数据,填充Related列,并写入新CSV with open('processed_EGLOINDOORCSV.csv', mode='w', encoding='utf-8', newline='') as outfile: # 获取原始CSV的所有列名,保证输出的CSV和原结构一致 fieldnames = reader.fieldnames writer = csv.DictWriter(outfile, fieldnames=fieldnames) # 先写入表头 writer.writeheader() # 重新读取原始数据,给每行填充Related with open('EGLOINDOORCSV.csv', mode='r', encoding='utf-8') as infile: reader = csv.DictReader(infile) for row in reader: serial = row['Serial'] # 把组内的Material用///拼接起来 related_str = '///'.join(grouped_materials[serial]) # 给当前行的Related列赋值 row['Related'] = related_str # 写入处理后的行 writer.writerow(row) print("处理完成!已生成新文件:processed_EGLOINDOORCSV.csv")
代码说明
- 用
csv.DictReader和csv.DictWriter:相比你原来用的csv.reader,可以直接通过列名(比如row['Serial'])获取数据,不用记索引(比如row[4]),更不容易出错,也更易读 grouped_materials字典:键是Serial的值,值是对应组的Material列表,同时做了最多5个的限制- 分两次读取CSV:第一次分组收集数据,第二次填充
Related列并写入新文件,这样逻辑更清晰 - 保留原CSV的所有字段:输出的新CSV会包含原始的所有列,只修改
Related列的值
测试你的示例数据
如果用你给出的示例数据运行这段代码,输出的CSV会和你想要的结果完全一致哦~
内容的提问来源于stack exchange,提问作者user7850757
相关产品推荐
相关产品推荐

