如何用Python的Pandas对比两个CSV时输出全部缺失重复行
问题与解决方案
需求
对比两个CSV文件,二者数据几乎一致,但第二个CSV包含两行第一个CSV没有的重复行,需要输出第二个CSV中所有独有的行(保留重复次数),同时可额外统计这些行的出现次数。
原代码问题
原代码将DataFrame的行转成集合(set),而集合会自动去重,导致无论第二个CSV中有多少重复的独有行,最终只能得到一次结果,无法保留重复次数。
原代码:
import csv import pandas as pd import numpy as np data1 = {"Col1": [0,1,1,2], "Col2": [1,2,2,3], "Col3": [5,2,1,1], "Col4": [1,2,2,3]} data2 = {"Col1": [0,1,1,2,4,4], "Col2": [1,2,2,3,4,4], "Col3": [5,2,1,1,4,4], "Col4": [1,2,2,3,4,4]} df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) ds1 = set(tuple(line) for line in df1.values) ds2 = set(tuple(line) for line in df2.values) df = pd.DataFrame(list(ds2.difference(ds1)), columns=df2.columns) print(df)
当前运行结果:
Col1 Col2 Col3 Col4 0 4 4 4 4
期望结果:
Col1 Col2 Col3 Col4 0 4 4 4 4 1 4 4 4 4
修改后的代码
方法1:保留所有重复的独有行
通过将每行转为元组,判断是否存在于第一个DataFrame中,筛选出所有独有行:
import pandas as pd data1 = {"Col1": [0,1,1,2], "Col2": [1,2,2,3], "Col3": [5,2,1,1], "Col4": [1,2,2,3]} data2 = {"Col1": [0,1,1,2,4,4], "Col2": [1,2,2,3,4,4], "Col3": [5,2,1,1,4,4], "Col4": [1,2,2,3,4,4]} df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 生成每行的元组,判断df2的行是否不在df1中 row_mask = ~df2.apply(tuple, axis=1).isin(df1.apply(tuple, axis=1)) # 筛选出所有独有的行(含重复) unique_rows = df2[row_mask] print(unique_rows)
运行结果与期望一致:
Col1 Col2 Col3 Col4 4 4 4 4 4 5 4 4 4 4
方法2:额外统计独有行的出现次数
如果需要统计每个独有行的出现次数,可以在上述基础上添加value_counts:
# 统计每个独有行的出现次数 count_result = unique_rows.value_counts().reset_index(name='出现次数') print(count_result)
运行结果:
Col1 Col2 Col3 Col4 出现次数 0 4 4 4 4 2
核心逻辑说明
- 避免使用集合去重,改用
apply(tuple, axis=1)将每行转为唯一标识的元组 - 通过
isin判断df2的行是否存在于df1中,取反后筛选出所有独有行 value_counts可以快速统计重复行的出现次数
内容的提问来源于stack exchange,提问作者Alithius
相关产品推荐
相关产品推荐

