У меня возникли проблемы с объединением двух фреймов данных с помощью pandas.merge()
в зависимости от определенных условий. Я был бы признателен за совет
В приведенном ниже примере я хочу объединить два фрейма данных по идентификатору клиента. Однако меня интересует только САМАЯ РАННЯЯ запись в loans_df
, которая соответствует условию:
Это означает, что это соединение один к одному (или один к нулю, если у клиента нет кредитов). Примечание. Я предполагаю, что формат даты — ггггммдд.
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()
безуспешно
Это выглядит как 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