Как удалить строки на основе условия?

#python #pandas #dataframe

Вопрос:

Я хочу найти:

  1. данные не найдены в поставщике, но найдены в бухгалтерии,
  2. данные, найденные в бухгалтерии, но не в поставщике
  3. данные найдены как в бухгалтерии, так и у поставщика, но суммы не совпадают.

Для этого мне нужно использовать три предоставленные таблицы Бухгалтерия, Помощник, Поставщик, Сначала я соединяю Бухгалтерию с Помощником по счету-фактуре. Затем я присоединяюсь к нему с провайдером на 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