Python 检查数据帧中的vaue是否存在于具有条件的另一个数据帧中

Python 检查数据帧中的vaue是否存在于具有条件的另一个数据帧中,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据帧,其结构类似于: Application | Account | Application_Date 1 | 444444 | 10/01/2018 2 | 444444 | 09/01/2018 3 | 555555 | 10/01/2018 以及一个不同的数据帧,其结构如下: Case | Account | Case_Date 1 | 444444 | 09/01/2

我有一个熊猫数据帧,其结构类似于:

Application | Account  |  Application_Date
1           | 444444   |  10/01/2018
2           | 444444   |  09/01/2018
3           | 555555   |  10/01/2018
以及一个不同的数据帧,其结构如下:

Case     | Account | Case_Date
1        | 444444  | 09/01/2018
2        | 444444  | 11/01/2018
3        | 444444  | 10/01/2018
4        | 555555  | 07/01/2018
我想检查第一个数据帧中的帐户是否存在于第二个数据帧中,仅当案例_日期大于或等于应用程序_日期时,然后在第一个数据帧的列中获取输出以及案例编号,如:

Application | Account  |  Application_Date | Case_Exists | Case_Number
1           | 444444   |  10/01/2018       |  Y          |  2, 3
2           | 444444   |  09/01/2018       |  Y          |  1, 2, 3
3           | 555555   |  10/01/2018       |  N          |
你能给我个建议吗


谢谢大家!

这是一个有点复杂的解决方案,但它能让你达到目的:

  • 将日期设置为适当的日期时间
  • 首先在两个数据帧之间进行合并
  • 查找案例日期大于或等于申请日期的位置,按
    应用程序
    帐户
    分组,并获取唯一案例
  • 将结果合并回您的第一个df
  • Y
    分配给非空值(发现案例时):
  • 设置: 过程:
    >>> df1
       Application  Account Application_Date
    0            1   444444       10/01/2018
    1            2   444444       09/01/2018
    2            3   555555       10/01/2018
    >>> df2
       Case  Account   Case_Date
    0     1   444444  09/01/2018
    1     2   444444  11/01/2018
    2     3   444444  10/01/2018
    3     4   555555  07/01/2018
    
    # set to datetime
    df1['Application_Date'] = pd.to_datetime(df1['Application_Date'])
    
    df2['Case_Date'] = pd.to_datetime(df2['Case_Date'])
    
    # first merge
    merged = df2.merge(df1)
    
    # loc and groupby
    cases = (merged.loc[merged['Case_Date'] >= merged['Application_Date']]
             .groupby(['Account','Application'])['Case']
             .unique())
    
    # merge back
    final = (cases.to_frame('Case_Number').merge(df1,left_index=True,
                                    right_on=['Account', 'Application'],
                                    how='outer')
             # Following line is just to re-adjust column order
             [['Application','Account','Application_Date','Case_Number']])
    
    # assign Y and N
    final['Case_Exists'] = final.Case_Number.notnull().map({True:'Y',False:'N'})
    
    >>> final
       Application  Account Application_Date Case_Number Case_Exists
    0            1   444444       2018-10-01      [2, 3]           Y
    1            2   444444       2018-09-01   [1, 2, 3]           Y
    2            3   555555       2018-10-01         NaN           N