# dfとdf2のマージを試みることで、'aaa'と'bbb'で一致する行を特定する
# how='left'を使用し、dfの全ての行を保持しつつ、df2との一致を探る
# indicator=Trueにより、マージ結果の各行がどのようにマージされたか(left_only, both, right_only)がわかる列が追加される
merged_df = pd.merge(df, df2, on=['aaa', 'bbb'], how='left', indicator=True)

# マージ結果から、df2に存在しない(left_only)dfのレコードのみを抽出
df_result = merged_df[merged_df['_merge'] == 'left_only'].drop(columns=['_merge'])

df_result