Вы можете объединить оба DataFrames вместе только на PatId
, что приведет к дате входа и выхода в df1, а затем вам просто нужно использовать сравнение даты и времени, чтобы отфильтровать его. Я также сбросил индексирование, которое у вас было, и избавился от вспомогательных столбцов на последнем экране, но делайте что хотите.
Как пример:
import pandas as pd
df1 = pd.DataFrame({'PatId': [725, 725, 725, 725, 117785, 117785],
'EntryDate': ['2005-01-03', '2005-01-04', '2005-01-05', '2005-01-06',
'2004-12-31', '2005-01-03'],
'Id': [1422, 1563, 1355, 118, 7999998, 796833],
'Data': ['X','X','X','X','X','X']})
df1['EntryDate'] = pd.to_datetime(df1.EntryDate)
df1.set_index(['PatId', 'EntryDate', 'Id'])
df2 = pd.DataFrame({'PatId': [725, 117785],
'EntryDate': ['2005-01-04', '2005-01-02'],
'ExitDate': ['2005-01-05', '2006-01-18']})
df2['EntryDate'] = pd.to_datetime(df2.EntryDate)
df2['ExitDate'] = pd.to_datetime(df2.ExitDate)
df2.set_index(['EntryDate', 'ExitDate'])
И это фактический код:
df = df1.reset_index().merge(df2.reset_index(), on='PatId', how='left', suffixes=['','_1'])
(df[(df.EntryDate >= df['EntryDate_1']) & (df.EntryDate <= df.ExitDate)]
.drop(columns=['EntryDate_1', 'ExitDate'])
.set_index(['PatId', 'EntryDate', 'Id']))
Data
PatId EntryDate Id
725 2005-01-04 1563 X
2005-01-05 1355 X
117785 2005-01-03 796833 X