具有多种条件的数据帧集成?

2024-06-02 05:09:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,如下所示:

ID.           Date1        X1    
0002       2015-08-01      81
0002       2015-08-15      95
0003       2015-10-01      115.    
0002       2015-09-15      126
0003       2015-10-15      129
0002       2016-02-01      265
0002       2016-02-15      279.      
0003       2016-03-15      281.    
0003       2016-03-15      281.     
0002       2016-03-01      294
0003       2016-04-01      298.       
0003       2016-04-01      298.       
0002       2016-03-15      308
0003       2017-02-15      618
0002       2017-02-01      631.        
0003       2017-03-01      632
0002       2017-02-15      645

第二个是休耕:

       ID.      DATE2.    
      0002   2016-02-11
  0003   2016-03-16
  0002   2017-01-19
  0003   2015-09-10
  0003   2016-02-19
  0003   2016-03-22
  0003   2015-12-07

现在,我想加入——合并——这两个数据_框架成为一个数据_框架,该框架基于ID和Data1以及Date2,并具有一定的条件。因此,我想要的数据帧应该如下所示:

ID       Date1                  X1     Date2
0002       2015-08-01           81     Nan  
0002       2015-08-15           95     Nan
0003       2015-10-01           115.   2015-09-10
0002       2015-09-15           126    Nan
0003       2015-10-15           129    Nan
0002       2016-02-01           265    Nan
0002       2016-02-15           279.   2016-02-11
0003       2016-03-15           281.   2015-12-07
0003       2016-03-15           281.   2016-02-19
0003       2016-04-01           298.   2016-03-16
0003       2016-04-01           298.   2016-03-22
0002       2016-03-15           308    Nan
0003       2017-02-15           618    Nan
0002       2017-02-01           631.   2017-01-19
0003       2017-03-01           632    Nan
0002       2017-02-15           645    Nan

假设Date1指向收集数据的日期,Date2指向事件。我需要在输出数据框中显示在收集数据的两个日期之间是否发生了事件。例如,对于2015-10-01和2015-10-15之间的ID:003,是否发生了事件?在本例中,差异为15天,但我们有收集到的数据之间的差异超过一个月的情况,例如ID:002 2015-10-15和2016-02-15。此外,如果两个日期(日期1)之间发生了两个事件,我希望将它们显示在不同的行中,如上述示例所示。有人能帮忙处理这件事吗

我还尝试了以下代码:

    myf = dataframe1.merge(dataframe2, how='left',on=['ID'])
    mask = (pd.to_datetime(myf['Data1'], format='%Y-%m-%d') -             
    pd.to_datetime(myf['Data2'], format='%Y-%m-%d')).apply(lambda I: i.days <= 15 and i.days > 0)
    myf.loc[~mask, 'Data2'] = np.nan

但是,只有每15天收集一次数据(在dataframe1中),它才能解决问题,在我的例子中,这并不总是正确的


Tags: 数据框架id事件mask差异nanpd