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

Python如何基于单列匹配删除两个CSV不匹配行且不合并文件

实现思路
  • 全程不合并两个CSV文件,仅先提取两个文件A列的公共取值集合
  • 分别对两个文件做行过滤,仅保留A列取值在公共集合内的行
  • 过滤完成后分别写回对应文件即可
实现代码

基于pandas的简洁实现

该方案代码量最小,先执行pip install pandas安装依赖后即可运行:

import pandas as pd

# 读取两个CSV文件,sep参数和实际文件分隔符保持一致
df_a = pd.read_csv("a.csv", sep='\t')
df_b = pd.read_csv("b.csv", sep='\t')

# 计算两个文件A列的取值交集
common_a_set = set(df_a['A']).intersection(set(df_b['A']))

# 分别过滤两个文件的非匹配行
df_a_filtered = df_a[df_a['A'].isin(common_a_set)]
df_b_filtered = df_b[df_b['A'].isin(common_a_set)]

# 写回原文件,不生成合并文件
df_a_filtered.to_csv("a.csv", index=False, sep='\t')
df_b_filtered.to_csv("b.csv", index=False, sep='\t')

基于Python标准库的零依赖实现

如果不想安装第三方库,可以直接用Python自带的csv模块实现:

import csv

# 第一步:分别收集两个文件的A列取值
a_values = set()
b_values = set()
with open("a.csv", "r", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f, delimiter='\t')
    for row in reader:
        # 如果A列是字符串类型,去掉int()转换即可
        a_values.add(int(row['A']))

with open("b.csv", "r", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f, delimiter='\t')
    for row in reader:
        b_values.add(int(row['A']))

# 计算A列交集
common_a = a_values & b_values

# 过滤并写回a.csv
filtered_a = []
with open("a.csv", "r", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f, delimiter='\t')
    headers = reader.fieldnames
    for row in reader:
        if int(row['A']) in common_a:
            filtered_a.append(row)
with open("a.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=headers, delimiter='\t')
    writer.writeheader()
    writer.writerows(filtered_a)

# 过滤并写回b.csv
filtered_b = []
with open("b.csv", "r", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f, delimiter='\t')
    headers = reader.fieldnames
    for row in reader:
        if int(row['A']) in common_a:
            filtered_b.append(row)
with open("b.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=headers, delimiter='\t')
    writer.writeheader()
    writer.writerows(filtered_b)
注意事项
  • 代码中sep/delimiter参数需要和你实际CSV文件的列分隔符匹配:你给出的示例文件是制表符分隔,所以默认填了\t;如果是逗号分隔的常规CSV,改成','即可。
  • 如果A列存储的是字符串而非数字,删掉代码中int()类型转换的逻辑,直接用原始字符串做集合比对,避免类型不匹配导致匹配失败。
  • 建议运行代码前先备份两个原CSV文件,防止写回操作失误导致数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:45:32