Получите различия между двумя файлами Excel - PullRequest
0 голосов
/ 22 октября 2018

Сводка проблемы

Учитывая 2 файла Excel, каждый с примерно 200 столбцами, и имеют общий столбец индекса - то есть каждая строка в обоих файлах будет иметь свойство name, скажем, что было бы лучшим для созданиявыходной файл Excel, который имеет только отличия от файла Excel 2 до файла Excel 1. Различия будут определяться как любые новые строки в файле 2 не в файле file1 и строки в файле file2, имеющие одинаковый индекс (имя), но один или несколькоиз других столбцов разные.Вот хороший пример использования панд, который может быть полезен: Сравните 2 файла Excel и выведите файл Excel с различиями Хотя сложно применить это решение к файлу Excel с 200 столбцами.

Образцы файлов

Ниже приведен пример из 2 упрощенных (столбцы уменьшены с 200 до 4) файлов Excel в формате csv, столбец индекса - Имя.

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 - это новая строка, отсутствующая в файле file1, а строка 1 содержит изменения от file1 доfile2.

Следующее работает, но столбец индекса теряется (вместо ['Tim', 'Melanie'] это [1, 2]:

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()

1 Ответ

0 голосов
/ 04 ноября 2018

Решением было использование 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...