使用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
相关产品推荐
相关产品推荐

