簡體   English   中英

獲取兩個excel文件之間的差異

[英]Get differences between two excel files

問題總結

給定 2 個 excel 文件,每個文件大約有 200 列,並且有一個共同的索引列 - 即兩個文件中的每一行都有一個 name 屬性說,最好生成一個輸出 excel 文件,它與 excel 文件有差異2 到 excel 文件 1。差異將定義為文件 2 中的任何新行而不是文件 1 中的任何新行,以及文件 2 中具有相同索引(名稱)但一個或多個其他列不同的行。 這里有一個使用 Pandas 的很好的例子,它可能很有用: 比較 2 個 Excel 文件並輸出一個有差異的 Excel 文件雖然很難將該解決方案應用於具有 200 列的 Excel 文件。

示例文件

下面是 2 個 csv 格式的簡化(列從 200 減少到 4 個)excel 文件的示例,索引列是名稱。

Name,value,location,Name Copy
Bob,400,Sydney,Bob
Tim,500,Perth,Tim

Name,value,location,Name Copy
Bob,400,Sydney,Bob
Tim,500,Adelaide,Tim
Melanie,600,Brisbane,Melanie

因此,鑒於上述 2 個輸入文件,輸出文件應為:

Name,value,location,Name Copy
Tim,500,Adelaide,Tim
Melanie,600,Brisbane,Melanie

因此輸出文件將有 2 行(不包括列標題行),第 2 行是不在文件 1 中的新行,第 1 行包含從文件 1 到文件 2 的更改。

以下工作,但索引列丟失(它是 [1, 2] 而不是 ['Tim', 'Melanie'] :

import pandas as pd
df1 = pd.read_excel('simple1.xlsx', index_col=0)
df2 = pd.read_excel('simple2.xlsx', index_col=0)

df3 = pd.merge(df1, df2, how='right', sort='False', indicator='Indicator')
df4 = df3.loc[df3['Indicator'] == 'right_only']
df5 = df4.drop('Indicator', axis=1)

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df5.to_excel(writer, sheet_name='Sheet1')
writer.save()

解決方案是使用 numpy.array_equal 來確定行是否相等:

import sys
import pandas as pd
import numpy as np

# Check for correct number of input arguments
if len(sys.argv) != 4:
    print('Usage :\n\tpython {} old_excel_file new_excel_file  output_excel_file\n'.format(sys.argv[0]))
quit()

# Import input files into dataframes
old_file = sys.argv[1]
new_file = sys.argv[2]
out_file = sys.argv[3]
df1 = pd.read_excel(old_file, index_col=0)
df2 = pd.read_excel(new_file, index_col=0)

# Merge dataframes, maintaining index 
df_merged = pd.merge(df1, df2, left_index=True, right_index=True, how='outer', sort=False, indicator='Indicator')

# Add right-only rows to output dataframe
right_only_index = df_merged.index[df_merged['Indicator'] == 'right_only']
df_out = df2.loc[right_only_index]

# Iterate through "both" rows, and append ones that are not equal to the output dataframe
both_index = df_merged.index[df_merged['Indicator'] == 'both']
df_both = df2.loc[both_index]

for i, values in df_both.iterrows():
    if not np.array_equal(df1.loc[i].values, df2.loc[i].values):
        df_out = df_out.append(df2.loc[i])

# Write output dataframe to an Excel file (first the two header rows, and then the data rows)
writer = pd.ExcelWriter(out_file, engine='xlsxwriter')
df_out.to_excel(writer, sheet_name='Sheet1')
writer.save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM