1. データが不整合している箇所の判定
timestamp
が同じ行同士のvalue
の値を比較して、値が異なる行が有るか否かで判定します。
具体的には
pd.merge()
を使い、共通の''timestamp''存在する行同士を横結合する
- それぞれの
value
の値が不一致の箇所を検索し、不一致の箇所があるならばエラー
と書くと複雑ですが、コードに落とすと
Python
1# ミスマッチの行を格納するDataFrame
2mismatch_df = df_A.merge(df_B, on='timestamp', how='inner').query('value_x != value_y')
3# ミスマッチの行が存在するか?(DataFrameが空ではない?)
4if not mismatch_df.empty:
5 # ミスマッチが存在する
となります。
2. データが結合
データフレームの結合は 1.の処理により、データが不整合している箇所がないという前提であれば、
- 2つのデータフレームを
pd.concat()
で縦結合する
- 重複している行を削除
で良いかと思います。
以上、上記を実装すると以下のようになります。
Python
1import pandas as pd
2import sys
3
4df_A = pd.DataFrame({'timestamp':[100, 200, 300], 'value':[5, 10, 16]})
5df_B = pd.DataFrame({'timestamp':[300, 400, 500], 'value':[15, 20, 30]})
6
7# timestampが共通で、データが不一致の行を抜き出す
8mismatch_df = df_A.merge(df_B, on='timestamp', how='inner').query('value_x != value_y')
9# 上記の結果が空でないならばエラー
10if not mismatch_df.empty:
11 # データの不一致の場合
12 print("### ERROR : データ不一致 ###")
13 print(mismatch_df.set_index('timestamp', drop=True))
14 sys.exit()
15
16# データを縦結合して、重複している行を削除する
17df = pd.concat([df_A, df_B]).drop_duplicates().reset_index(drop=True)
18print(df)