У меня есть ряд дебетовых и кредитных строк в кадре данных pandas (некоторые примеры данных ниже):
+----------+-------+--------------+--------+
| Date | Party | Debit/Credit | Amount |
+----------+-------+--------------+--------+
| 9/1/2020 | Wells | Debit | 4 |
| 9/1/2020 | Wells | Credit | -4 |
| 9/1/2020 | Wells | Debit | 4 |
| 9/1/2020 | Wells | Debit | 4 |
| 9/2/2020 | BOA | Credit | -4 |
| 9/2/2020 | BOA | Debit | 4 |
| 9/3/2020 | Chase | Debit | 4 |
+----------+-------+--------------+--------+
Я пытаюсь определить совпадающие пары Date/Party и суммы, в которых они компенсируются. Например, на 9/1 вы можете увидеть взаимозачетные дебетовые и кредитные транзакции с Wells.
То, что я пытался сделать, это создать отдельный фрейм данных Debit и Credit, а затем объединить их на Date/Party.
df = pd.DataFrame({'Date': ['9/1/2020','9/1/2020', '9/1/2020', '9/1/2020', '9/2/2020', '9/2/2020', '9/3/2020'],
'Party': ['Wells', 'Wells', 'Wells', 'Wells', 'BOA', 'BOA', 'Chase'],
'Debit/Credit': ['Debit', 'Credit', 'Debit', 'Debit', 'Credit', 'Debit', 'Debit'],
'Amount': [4, -4, 4, 4, -4, 4, 4]})
debit_df = df.loc[df['Debit/Credit'] == 'Debit']
credit_df = df.loc[df['Debit/Credit'] == 'Credit']
offset_df= debit_df.merge(credit_df, on = ['Date', 'Party'])
matching_trans = offset_df.loc[offset_df['Amount_x'] == abs(offset_df['Amount_y'])]
Проблема с этим подходом заключается в том, что я, очевидно, получаю декартово произведение, в котором есть несколько похожих транзакций Уэллса. Есть ли способ определить только совпадающие пары для Уэллса (т.е. дебет 4, кредит -4) только количество раз, когда это происходит? Мои данные намного больше, но в этом примере вы вернете только 1 результат в финальном кадре данных matching_trans
.