#python #pandas #dataframe
Вопрос:
Я хочу найти:
- данные не найдены в поставщике, но найдены в бухгалтерии,
- данные, найденные в бухгалтерии, но не в поставщике
- данные найдены как в бухгалтерии, так и у поставщика, но суммы не совпадают.
Для этого мне нужно использовать три предоставленные таблицы Бухгалтерия, Помощник, Поставщик, Сначала я соединяю Бухгалтерию с Помощником по счету-фактуре. Затем я присоединяюсь к нему с провайдером на toID. После слияния внутреннего соединения у меня есть таблица, которая в этом случае создает две ненужные записи.
Таблица учета выглядит так:
doc_nr | сумма | счет-фактура |
---|---|---|
a1 | -9.17 | i1 |
a2 | 9.17 | i1 |
Вспомогательный стол:
тоИД | счет-фактура |
---|---|
toid1 | i1 |
Таблица поставщиков:
тоИД | tid | Дата | тАмаунт |
---|---|---|---|
toid1 | t1 | 2021-01-18 | 9.17 |
toid1 | t2 | 2021-01-19 | -9.17 |
После объединения трех таблиц с помощью merge inner join я получил таблицу:
doc_nr | сумма | счет-фактура | тоИД | tid | тАмаунт | Дата |
---|---|---|---|---|---|---|
a1 | -9.17 | i1 | toid1 | t1 | 9.17 | 2021-01-18 |
a1 | -9.17 | i1 | toid1 | t2 | -9.17 | 2021-01-19 |
a2 | 9.17 | i1 | toid1 | t1 | 9.17 | 2021-01-18 |
a2 | 9.17 | i1 | toid1 | t2 | -9.17 | 2021-01-19 |
Ожидаемый результат должен составлять всего 2 записи вместо 4:
doc_nr | сумма | счет-фактура | тоИД | tid | тАмаунт | Дата |
---|---|---|---|---|---|---|
a1 | -9.17 | i1 | toid1 | t2 | -9.17 | 2021-01-19 |
a2 | 9.17 | i1 | toid1 | t1 | 9.17 | 2021-01-18 |
Не могу придумать, как отфильтровать таблицу, чтобы получить ожидаемые результаты.
Попытался удалить дубликаты на основе doc_nr, но результаты дают:
doc_nr | сумма | счет-фактура | тоИД | tid | тАмаунт | Дата |
---|---|---|---|---|---|---|
a1 | -9.17 | i1 | toid1 | t2 | -9.17 | 2021-01-19 |
a2 | 9.17 | i1 | toid1 | t2 | -9.17 | 2021-01-18 |
У него должен быть другой tID; doc_nr и сумма совпадают с тамаутом. После соединения кажется, что он дублирует doc_nr, создавая его с помощью других doc_nr и tID.
Есть какие-нибудь идеи о том, как очистить эти повторяющиеся строки и достичь ожидаемого результата?
Комментарии:
1. как вы решаете, какое значение следует возвращать в столбцах tID, тАмаунт и Дата?
2. на основе записей в таблице, которая состоит из doc_nr, суммы, счета-фактуры и объединена с вспомогательными данными по счету-фактуре. Вспомогательные данные предоставляют идентификатор toID для сопоставления записей в таблице поставщика, которая имеет тот же идентификатор toID, но другой идентификатор tID.
3. Я думаю, вам, возможно, потребуется поделиться образцами таблиц, которые вы используете для получения этих результатов, потому что во второй таблице строки не дублируются, так как значения в столбцах tID, количество и Дата отличаются. Трудно понять логику того, чего ты хочешь
4. Обновленный. Таблицы поставщиков имеют дубликаты идентификаторов toID с разными идентификаторами tID.
Ответ №1:
Попробуй это:
>>> df.assign(x=df['amount'].eq(df['tAmount']).cumsum()).replace(0, np.nan).dropna().drop_duplicates(subset=['doc_nr', 'x']).drop('x', axis=1)
doc_nr amount invoice toID tID tAmount DATE
1 a1 -9.17 i1 toid1 t2 -9.17 2021-01-19
2 a2 9.17 i1 toid1 t1 9.17 2021-01-18
>>>
Комментарии:
1. нет, это дает один и тот же tID , они должны быть t2 для a1 и t1 для a2
2. @A99 В чем тут логика?
3. после df.drop_duplicates(подмножество=’doc_nr’, keep=’последний») результаты совпадают только для a1, но у a2 должно быть число 9.17 и tID t1, как первая запись a2 в первой таблице
4. @A99 Отредактировал мой ответ, теперь он работает
5. для меня при попытке использовать df.assign(x=df[‘количество’].eq(df[‘количество’]).cumsum()).заменить(0, np.nan). dropna().drop_duplicates(подмножество=[‘doc_nr’, ‘x’]).drop(‘x’, ось=1) дает только пустой df. Я реализую код на полном df
Ответ №2:
Как вы уже упоминали, вы хотите amount
соответствовать tAmount
:
У него должен быть другой tID; doc_nr и сумма совпадают с тамаунтом.
затем вы должны также включить эти 2 поля во вторую инструкцию merge следующим образом:
(Accounting.merge(Helper)
.merge(Provider, left_on=['toID', 'amount'], right_on=['toID', 'tAmount'])
)
используйте параметры left_on=
и right_on=
, чтобы включить связанные 2 поля слияния.
Результат:
doc_nr amount invoice toID tID DATE tAmount
0 a1 -9.17 i1 toid1 t2 2021-01-19 -9.17
1 a2 9.17 i1 toid1 t1 2021-01-18 9.17