You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Python代码:计算CSV文件中行与行的列差异数

Python实现CSV文件两两行差异统计

核心思路

  1. 读取CSV文件,提取每行的唯一ID和对应的数据列(排除ID列)
  2. 遍历所有行的两两组合,逐列对比统计差异数量
  3. 将结果写入新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:35:03