比较两个excel文件并返回不常见的行

Posted

技术标签:

【中文标题】比较两个excel文件并返回不常见的行【英文标题】:Compare two excel files and return non common rows 【发布时间】:2021-07-12 04:42:19 【问题描述】:

我有两个如下所示的 excel 文件- File1.xlsx 文件2.xlsx

我想比较每一行和每一列,并从两个文件中删除共同的行(列标题除外)。输出应如下所示 - File1.xlsx File2.xlsx

我的代码-

import pandas
from datetime import datetime
import numpy


df = pandas.read_excel('File1.xlsx')
FORMAT = ['col1','col2','col3']
df_selected = df[FORMAT]

df2 = pandas.read_excel('File2.xlsx')
FORMAT2 = ['col1','col2','col3']
df_selected2 = df2[FORMAT2]



def compare(row1,row2):
    # print(row1,row2)
    flag = False
    i = 0
    for t1, t2 in zip(row1, row2):

        #if it is first value
        #check dates

        if(i==0):
            formattedDT = datetime.strptime(t1, '%d-%b-%Y')

            if(formattedDT!=t2):
                flag = True
                break
        elif(t1!=t2):
            flag = True
            break

        i=i+1

    if(flag is False):
        return 'matched'
    else:
        return 'mismatched'    


def iterate(array1, array2):
    result = array1
    for index, row1 in enumerate(array1):
        for row2 in array2:
            if(compare(row1,row2)=='matched'):
                del result[index]
                break
    df = pandas.DataFrame(result)
    df.columns=['col1','col2','col3']
    writer = pandas.ExcelWriter('output.xlsx', engine='xlsxwriter')
    df.to_excel(writer, sheet_name='welcome', index=False)
    writer.save()    
                



iterate(df_selected.values,df_selected2.values)

但是我得到了这个错误输出- ValueError: 无法删除数组元素

请帮忙。

【问题讨论】:

我认为 pandas.merge 在这里会有所帮助,然后寻找 _merge 字段。 import pandas as pd left = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) right = pd.DataFrame([[1, 2], [7, 4]], columns=list('AB')) merge=pd.merge(left,right,how="outer",on=['A','B'],indicator=True) @simpleApp 你可以缩进你的代码并解释你的解决方案。谢谢。 我想你们都准备好了。如果您需要任何额外的支持,请告诉我。干杯! 【参考方案1】:

你可以试试这个解决方案。它应该会给你想要的结果

df1 =pd.read_excel('File1.xlsx',parse_dates=['col1'],sep='\t')
df2 = pd.read_excel('File2.xlsx',parse_dates=['col1'],sep='\t',dayfirst=True)
temp_df = pd.concat([df1,df2])
temp_df.reset_index(inplace=True,drop=True)
temp_df.drop_duplicates(subset=['col1','col2','col3'], keep=False, inplace=True)

final_df1 = pd.merge(df1, temp_df, how='inner', on=['col1','col2','col3'])
final_df2 = pd.merge(df2, temp_df, how='inner', on=['col1','col2','col3'])

final_df1.to_excel('file_1_modified.xlsx',index=False)
final_df2.to_excel('file_2_modified.xlsx',index=False)

以下是我的结果的快照。请注意,我已从 csv 文件中读取数据。所以我在快照上使用了 pd.read_csv()。但它会给出相同的结果

【讨论】:

嘿,感谢您的尝试,尽管我将两个文件的所有行和所有列并排放置在两个修改后的文件中。显示重复和非重复。 嘿@sandy,我已经修改了答案..你可以试试 现在显示正确的编号。每个文件中的列,但它仍然显示每个文件中的所有行,重复数据删除没有发生。 啊...在代码中进行了最后一轮更新...我想这次它应该可以工作了..您可以检查 temp_df 列,它是没有任何重复的组合数据框 @sandy ...我确实创建了 2 个类似于您的数据的 csv 文件并添加了一些快照以供参考。还检查我在阅读时添加了 dayfirst 参数...。检查这个有用的 url towardsdatascience.com/…

以上是关于比较两个excel文件并返回不常见的行的主要内容,如果未能解决你的问题,请参考以下文章

使用python返回excel中两个不同文件中两列之间的差异

Excel VBA 比较两个表格的不同?

怎么用C++获取Excel内有效数据的行数

匹配绝对值并返回整列 EXCEL

在两个xlsx文件之间查找相同的行

VBA宏在Excel中格式化1个包含文本行的单元格,并将这些行添加到单独的行中