Как объединить 2 кадра данных pandas на основе критериев

У меня возникли проблемы с объединением двух фреймов данных с помощью pandas.merge() в зависимости от определенных условий. Я был бы признателен за совет

В приведенном ниже примере я хочу объединить два фрейма данных по идентификатору клиента. Однако меня интересует только САМАЯ РАННЯЯ запись в loans_df, которая соответствует условию:

  1. Клиенты.КонечнаяДата < Кредиты.Дата
  2. Сумма кредита > 100

Это означает, что это соединение один к одному (или один к нулю, если у клиента нет кредитов). Примечание. Я предполагаю, что формат даты — ггггммдд.

import pandas as pd 

Customer_df = pd.DataFrame({ 'CustomerId': [1,2,3], 'End date ': [‘20240101’, ‘20220101’, ‘20250101’] }) 
Loans_df = pd.DataFrame({ 'LoanId': [1,2,3], 'CustomerId': [1,2,2], ‘Date’: [‘20240112’, ‘20230101’, ‘20240101’], 'Amount': [1000,2000,4000]})

Пробовал pandas.merge() безуспешно

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это выглядит как merge_asof после предварительной фильтрации Loans_df, чтобы сохранять только значения выше 100:

# prerequisite: ensure correct datetime
# Customer_df['End date'] = pd.to_datetime(Customer_df['End date'], format='%Y%m%d')
# Loans_df['Date'] = pd.to_datetime(Loans_df['Date'], format='%Y%m%d')

out = pd.merge_asof(Customer_df.sort_values(by='End date'),
                    Loans_df.query('Amount > 100').sort_values(by='Date'),
                    left_on='End date', right_on='Date', by='CustomerId',
                    direction='forward'
                   )

Выход:

   CustomerId   End date  LoanId       Date  Amount
0           2 2022-01-01     2.0 2023-01-01  2000.0
1           1 2024-01-01     1.0 2024-01-12  1000.0
2           3 2025-01-01     NaN        NaT     NaN

Если вам нужны только совпадения, добавьте дропна:

out = (pd.merge_asof(Customer_df.sort_values(by='End date'),
                     Loans_df.query('Amount > 100').sort_values(by='Date'),
                     left_on='End date', right_on='Date', by='CustomerId',
                     direction='forward')
         .dropna(subset=['Date'])
      )

Выход:

   CustomerId   End date  LoanId       Date  Amount
0           2 2022-01-01     2.0 2023-01-01  2000.0
1           1 2024-01-01     1.0 2024-01-12  1000.0

Другие вопросы по теме