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

使用Pandas isin比较列数行数不同的CSV并计算匹配率

问题解答

1. 提取共有的Id及关联列生成新CSV

你的现有代码仅分别筛选出两表中含匹配Id的行,未合并两表列数据。正确做法是用merge做内连接,只保留共有的Id并合并所有关联列,注意csv2的Id列名为ID,需先统一列名避免匹配失败:

import pandas as pd

def pnd_check():
    df1 = pd.read_csv("csv1.csv")
    df2 = pd.read_csv("csv2.csv")
    
    # 统一Id列名(csv2为ID,csv1为Id)
    df2.rename(columns={"ID": "Id"}, inplace=True)
    
    # 内连接保留共有Id,合并所有列
    merged_df = pd.merge(df1, df2, on="Id", how="inner")
    
    # 生成目标CSV,可按需调整列顺序
    merged_df.to_csv("matched_result.csv", columns=["T_Id", "Id", "Km1", "Km2"], index=False)
    
    print("合并后的匹配数据已保存到matched_result.csv")

pnd_check()

2. 对Km1或Km2列排序

完全可以,不管是原表还是合并后的结果,都能用sort_values实现排序:

  • 按Km1升序排序合并结果:
sorted_by_km1 = merged_df.sort_values(by="Km1", ascending=True)
  • 按Km2降序排序合并结果:
sorted_by_km2 = merged_df.sort_values(by="Km2", ascending=False)
  • 若要直接修改原DataFrame,添加inplace=True参数即可。

3. 除Pandas外更高效的CSV比较方法

针对大文件场景,用Python标准库csv结合集合/字典更省内存(无需加载全文件到内存),集合成员查找为O(1)时间复杂度:

import csv

def efficient_match():
    # 读取csv1的Id与对应Km1,存入字典
    id_km1_map = {}
    with open("csv1.csv", "r", newline="") as f1:
        reader = csv.DictReader(f1)
        for row in reader:
            id_km1_map[row["Id"]] = row["Km1"]
    
    # 提取csv1的Id集合用于快速匹配
    csv1_ids = set(id_km1_map.keys())
    
    # 遍历csv2,筛选匹配行并合并列
    with open("csv2.csv", "r", newline="") as f2, open("matched_result.csv", "w", newline="") as out_f:
        reader = csv.DictReader(f2)
        fieldnames = ["T_Id", "ID", "Km1", "Km2"]
        writer = csv.DictWriter(out_f, fieldnames=fieldnames)
        writer.writeheader()
        
        for row in reader:
            current_id = row["ID"]
            if current_id in csv1_ids:
                row["Km1"] = id_km1_map[current_id]
                writer.writerow(row)

efficient_match()

该方法内存占用远低于Pandas,适合处理超大CSV文件。

4. 基于总Id数量计算匹配率

可以计算,需明确两个核心数值:匹配的唯一Id数量、两表所有唯一Id总数量(或单表Id总数,按需选择)。

计算方式1:匹配率 = 匹配的唯一Id数 / 两表所有唯一Id总数

import pandas as pd

def calculate_match_rate():
    df1 = pd.read_csv("csv1.csv")
    df2 = pd.read_csv("csv2.csv")
    
    df2.rename(columns={"ID": "Id"}, inplace=True)
    
    # 获取两表的唯一Id集合
    set1 = set(df1["Id"].unique())
    set2 = set(df2["Id"].unique())
    
    matched_count = len(set1 & set2)
    total_unique_ids = len(set1 | set2)
    
    match_rate = matched_count / total_unique_ids if total_unique_ids != 0 else 0
    print(f"匹配率:{match_rate:.2%}")

calculate_match_rate()

计算方式2:匹配率 = 匹配的Id数 / csv1总Id数(查看csv1的Id在csv2中的匹配比例)

match_rate = matched_count / len(set1) if len(set1) !=0 else 0

内容的提问来源于stack exchange,提问作者Finch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:40:26