Фильтруйте больший DataFrame, используя диапазоны дат и значения столбцов из меньшего - PullRequest
0 голосов
/ 29 апреля 2018

У меня больше DataFrame, df1, это выглядит так:

                         Data
PatId  EntryDate  Id                                        
725    2005-01-03 1422   X
       2005-01-04 1563   X
       2005-01-05 1355   X
       2005-01-06 118    X
       2005-01-09 1400   X
...                                                       
117785 2004-12-31 799998 X
       2005-01-03 796833 X
       2005-01-05 798728 X
       2005-01-08 798545 X 
       2005-01-11 797632 X

И поменьше DataFrame, df2, который выглядит так:

                         PatId
EntryDate  ExitDate          
2005-01-15 2005-04-15   22407
2005-01-30 2005-04-30   95938
2005-02-07 2005-05-07  116812
2005-02-18 2005-05-18   12163
2005-02-21 2005-05-21   22908

Мне бы хотелось, чтобы элегантный способ фильтрации df1 включал только строки для каждого PatId, которые лежат между индексами EntryDate и ExitDate в df2.

1 Ответ

0 голосов
/ 29 апреля 2018

Вы можете объединить оба 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...