求Python代码:计算CSV文件中行与行的列差异数
Python实现CSV文件两两行差异统计
核心思路
- 读取CSV文件,提取每行的唯一ID和对应的数据列(排除ID列)
- 遍历所有行的两两组合,逐列对比统计差异数量
- 将结果写入新CSV,包含
id1、id2、differences三列
方案一:纯CSV模块(适合超大文件,低内存占用优化)
该方案使用Python内置csv模块,无第三方依赖,适合处理行数较多的CSV文件:
import csv def count_differences(row1, row2): """统计两行数据的差异列数""" return sum(1 for col1, col2 in zip(row1, row2) if col1 != col2) def process_large_csv(input_path, output_path, id_column_index=0): # 读取输入文件,存储每行ID和数据 rows = [] with open(input_path, 'r', newline='', encoding='utf-8') as infile: reader = csv.reader(infile) next(reader) # 跳过表头行 for row in reader: if not row: continue row_id = row[id_column_index] # 提取除ID列外的所有数据 data = row[:id_column_index] + row[id_column_index+1:] rows.append((row_id, data)) # 生成对比结果并写入输出文件 with open(output_path, 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) writer.writerow(['id1', 'id2', 'differences']) # 遍历所有无序对(i < j),避免重复计算 for i in range(len(rows)): id1, data1 = rows[i] for j in range(i + 1, len(rows)): id2, data2 = rows[j] diff_count = count_differences(data1, data2) writer.writerow([id1, id2, diff_count]) # 如需生成有序对(即同时写入(id2, id1, diff_count)),取消下方注释 # writer.writerow([id2, id1, diff_count]) # 调用示例:假设ID在第1列(索引0) process_large_csv('input.csv', 'output.csv', id_column_index=0)
方案二:Pandas实现(代码简洁,适合中等规模文件)
如果CSV文件规模适中,使用Pandas可以大幅简化代码:
import pandas as pd import itertools def count_row_diff(row_a, row_b): """统计单行间的差异列数""" return (row_a != row_b).sum() def process_csv_with_pandas(input_path, output_path, id_column_name='id'): df = pd.read_csv(input_path) # 提取ID列表和数据行 ids = df[id_column_name].tolist() data_matrix = df.drop(columns=[id_column_name]).values # 生成所有两两组合的对比结果 results = [] for (i, id1), (j, id2) in itertools.combinations(enumerate(ids), 2): diff_count = count_row_diff(data_matrix[i], data_matrix[j]) results.append([id1, id2, diff_count]) # 如需有序对,添加以下行 # results.append([id2, id1, diff_count]) # 写入结果文件 result_df = pd.DataFrame(results, columns=['id1', 'id2', 'differences']) result_df.to_csv(output_path, index=False) # 调用示例:假设ID列名为'id' process_csv_with_pandas('input.csv', 'output.csv', id_column_name='id')
注意事项
- 缺失值处理:如果CSV存在空值,建议提前统一替换(如将空字符串替换为
'NaN'),避免因缺失值被判定为差异 - 内存优化:如果处理百万级以上行的CSV,纯CSV方案也会占用较多内存,可考虑分块读取+数据库存储(如SQLite)的方式逐行对比
- 重复控制:代码默认生成无序对(仅统计
id1 < id2的组合),如需包含id2 < id1的反向对比,取消对应注释即可 - ID唯一性:确保CSV中的ID列无重复值,否则会导致对比结果混淆
内容的提问来源于stack exchange,提问作者Wave Mirai
相关产品推荐
相关产品推荐

