You need to enable JavaScript to run this app. 用Python Pandas对比3个CSV文件 统计指定列的重复与差异项数量
优惠活动
大模型
产品
解决方案
定价
更多

用Python Pandas对比3个CSV文件 统计指定列的重复与差异项数量

三CSV同列比对统计实现方案

代码偏差与报错原因

  • 最初写的print(df[~df.colB.isin(df1.colB)])返回全表的问题,通常是两类原因:一是读文件时未对列值做基础清洗,比如IP前后带空格、域名大小写不统一,导致匹配逻辑完全失效;二是读取CSV时路径填错,df和df1实际读了同一份文件,自然没法筛出不匹配项。
  • 第二份修改后代码触发回溯错误的核心是运算符优先级问题:~(逻辑取反)的运算优先级远高于.count(),代码~df.colB.isin(df1.colB).count()的实际执行逻辑是先算出df.colB.isin(df1.colB)的匹配结果总条数,再对这个数字做逻辑取反——数值类型根本不支持逻辑取反,必然触发类型错误。

可直接复用的统计逻辑

按照需求以csv1的列为比对基准,分别和csv2、csv3的同列做匹配,统计两类计数:

  • 重复匹配项总数:csv1的列值中,同时存在于csv2、csv3同列的记录条数
  • 差异项总数:csv1的列值中,未同时匹配csv2、csv3同列的记录条数

实现步骤:

  • 第一步:读取CSV并做列值标准化,避免格式问题导致的误匹配
import pandas as pd

# 替换为你实际的文件路径
df1 = pd.read_csv("csv1文件路径.csv")
df2 = pd.read_csv("csv2文件路径.csv")
df3 = pd.read_csv("csv3文件路径.csv")

# 切换比对列时(colB=IP、colC=哈希、colD=域名),只需要修改这里的列名即可
target_column = "colB"
# 统一对三个文件的目标列做格式清洗:转字符串、去前后空格、统一小写
for single_df in [df1, df2, df3]:
    single_df[target_column] = single_df[target_column].astype(str).str.strip().str.lower()
  • 第二步:计算两类统计值
# 标记csv1的每个值是否在另外两个文件的同列存在
match_in_df2 = df1[target_column].isin(df2[target_column])
match_in_df3 = df1[target_column].isin(df3[target_column])

# 同时匹配两个文件的计入重复匹配总数
matched_count = (match_in_df2 & match_in_df3).sum()
# 剩余的全部计入差异总数
diff_count = len(df1) - matched_count

# 仅输出计数结果,不需要返回明细
print(f"重复匹配项总数量:{matched_count}")
print(f"存在差异的项总数量:{diff_count}")

拓展适配

如果需要统计的是三个文件同列的全局交集项(不绑定csv1为基准,只要三个文件都存在的同列值就算匹配),可以直接用集合运算快速计算:

# 把三个文件的目标列转成集合
set1 = set(df1[target_column])
set2 = set(df2[target_column])
set3 = set(df3[target_column])

common_count = len(set1 & set2 & set3)
# 总项数为三个集合的并集长度,减去共同存在的项数就是差异总数
total_item = len(set1 | set2 | set3)
diff_count = total_item - common_count

踩坑提醒

  • 写带~的筛选逻辑时,一定要给isin的判断结果加括号,比如正确的不匹配筛选写法是~(df.colB.isin(df1.colB)),否则运算顺序错了大概率报错。
  • 因为存储的IP、哈希、域名都容易出现格式不一致问题,提前做标准化清洗能避免绝大多数匹配不准的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 08:06:09