PYTHONで神Excelを何とかするシリーズ
#10 2つのファイルを比較して差があったら表示する
前回はこちら
常日頃からエクセルでレポートを受け取っていると、どこが変わったのかだけ知りたいことがあります。
少なくとも私は上司からそう依頼されました。
毎日同じフォーマットのエクセルで出力されるレポート(大体1000行くらいある)を2つ並べて比較するのは結構大変です。
一応、相互にvlookupとかすれば見つけられると思いますけど、ぶっちゃけ面倒ですよね
ということで今回はこれを一発で比較して変わったデータと変わってないデータを表示する比較表を作ることを目指します
今回の処理もOpenpyxlは使わないのでとりあえずPandasだけインポートします。比較対象にするファイルを2つ開きたいのでfiledialogもインポートして置きましょう
import pandas as pd
from tkinter import filedialogkinou = filedialog.askopenfilename()
kyou = filedialog.askopenfilename()
#昨日と今日のファイルを開きますdf1 = pd.read_excel(kinou, data_only = True, sheet_name = ‘Sheet1’)
df2 = pd.read_excel(kyou, data_only = True, sheet_name = ‘Sheet1’)
#データフレーム作成
パターン1:特定の一つの列だけが変更される事がわかっている場合
一つの列以外は常に同じ値の場合(例えば在庫列にありorなし、が入る場合とか。その他の属性が変わらない)は比較する列の名前を変えてマージするという手が使えます
df1 = df1.rename(columns = {‘zaiko’:’zaiko_kinou’})
df2= df2.rename(columns = {‘zaiko’:’zaiko_kyou’})
#それぞれの在庫行をリネームdf = pd.merge(df1,df2)
#データフレームをマージ
データフレームをマージすると同じデータの入っている行はマージされるので一つの品目が1行になります
これで在庫(今日)と在庫(昨日)が1行に存在するリストができました。
ここにもう1列判定列を追加して比較します
df[‘hikaku’] = (df[‘zaiko_kinou’] == df[‘zaiko_kyou’])
#hikaku列を作成して在庫(昨日)と在庫(今日)を比較
#この列は条件式なのでTrueかFalseで出力されるdf = df.replace({‘hikaku’:{False: ‘変更あり’, True: ‘変更なし’}})
#hikaku列がTrue(昨日と今日が同じ)なら変更なし、False(昨日と今日で違う)なら変更ありに上書き
これで在庫列に変更があったアイテムに変更ありフラグが付きました。あとは条件付き書式なりなんなりでハデハデにしてあげれば上司もにっこり
パターン2:複数列が変更される可能性がある場合
この場合はちょっと複雑です。
とりあえず変更があったアイテムだけがわかればいいということにして(どの列が変更されたかは問題にしない)以下のように比較列を作ってみます
df1[‘hikaku2’] = df1[[‘tanka’,’zaiko’,’tantou’]].apply(lambda x : ‘{}_{}_{}’.format(x[0],x[1],x[2]), axis = 1)df2[‘hikaku2’] = df2[[‘tanka’,’zaiko’,’tantou’]].apply(lambda x : ‘{}_{}_{}’.format(x[0],x[1],x[2]), axis = 1)#変更されるかも知れない列を結合して比較列を作成。これで一つでも要素が変われば異なるデータとして認識されますdf2[‘hantei’] = (df1[‘hikaku2’] == df2[‘hikaku2’])
df2 = df2.replace({‘hantei’:{False: ‘変更あり’, True : ‘変更なし’}})
これでとりあえず単価、在庫、担当のいずれかの列に変更があった場合には変更ありと表示されます。
どの列が変更されたかも検出したい場合はパターン1のように各列の比較列を作成してそれぞれで比較することになります(ちょっとめんどう)
前回までの目次