Как найти совпадающие и не совпадающие значения между двумя столбцами и отформатировать их следующим образом?
Введите:
| expected | match | forward | backward | actual |
|----------|-------|---------|----------|--------|
| a | | | | b |
| b | | | | c |
| c | | | | r |
| d | | | | s |
| e | | | | |
Выход:
| expected | match | forward | backward | actual |
|----------|-------|---------|----------|--------|
| a | b | a | r | b |
| b | c | d | s | c |
| c | | e | | r |
| d | | | | s |
| e | | | | |
forward
- присутствует в expected
, но не в actual
(SQL left outer join
)
backward
- присутствует в actual
, но не в expected
(SQL right outer join
)
match
- присутствует в expected
и actual
(SQL inner join
)
expected
- это то, что я получаю из запроса SQL
. У меня много сценариев, когда в СУБД нет столбца actual
, поэтому для сравнения пришлось бы использовать Excel. Я могу сравнить его, как правило, используя VLOOKUP
, но это отнимает много времени, а также не дает желаемого формата. Я хотел бы получить решение, которое можно сделать , что важно с форматом, как указано выше.
Я открыт для предложений. Я лично делаю это, используя python / pandas, но мои коллеги не привыкли к python, поэтому я бы предпочел решение, которое можно сделать одним нажатием кнопки, или автоматизировать с помощью VBA, или функцию через Excel, в основном все, что Я могу поделиться со своими коллегами по Excel, которые могут ускорить процесс. В настоящее время они повторяют полоскание VLOOKUP->Filter->Copy->Paste to another sheet
для всех трех столбцов.
Одно из предложенных решений - https://superuser.com/a/1417235/954024, но оно работает очень медленно и неэффективно, моя система зависла только при использовании этого: (
Мое решение на python:
import pandas as pd
import sys
def find_discrepancies(input_file):
"""
input: df
output: formatted df
"""
df = pd.read_excel(input_file)
df['match'] = df.loc[df['expected'].isin(df['actual'])].reset_index()[
'expected']
df['forward'] = df.loc[df['expected'].isin(
df['actual']) == False].reset_index()['expected']
df['backward'] = df.loc[df['actual'].isin(
df['expected']) == False].reset_index()['actual']
df = df[['expected', 'match', 'forward', 'backward', 'actual']]
counts = df.count()
df.columns = [df.columns[i].capitalize() + ' - ' + str(counts.values[i]) for i in range(5)]
df.fillna('', inplace=True)
return df
def main(inputFile, outputFile):
df = find_discrepancies(inputFile)
df.to_excel(outputFile, index=False)
if __name__ == '__main__':
inputFile = sys.argv[1]
outputFile = sys.argv[2]
main(inputFile, outputFile)