Я бы использовал сводную таблицу:
df = df1.pivot_table(columns = ['A'],values = 'B', index = 'C')
df2 = pd.DataFrame({'D': df['a'] - df['b']})
Риск в ответе @YOBEN_S состоит в том, что он потерпит неудачу, если b
появится раньше a
для данного значения C