比较两个数据帧并根据多个条件删除行

时间:2020-08-19 09:18:22

标签: python pandas

如果我有两个以下格式的日期框架。 df-a:

         ID         Start_Date     End_Date 
1        cd2        2020-06-01     2020-06-09              
2        cd2        2020-06-24     2020-07-21             
3        cd56       2020-06-10     2020-07-03              
4        cd915      2020-04-28     2020-07-21              
5        cd103      2020-04-13     2020-04-24

和df-b:

         ID         Date
1        cd2        2020-05-12                   
2        cd2        2020-04-12                  
3        cd2        2020-06-29                  
4        cd15       2020-04-28                   
5        cd193      2020-04-13     

        

我需要丢弃df-b中所有ID的所有行,因为它们属于df-a中相同ID的各种日期范围。即答案

         ID         Date
1        cd2        2020-05-12                   
2        cd2        2020-04-12                  
                
4        cd15       2020-04-28                   
5        cd193      2020-04-13   

因为ID cd2是唯一在df-a中匹配且其日期在cd2的日期范围从df-a之内的ID。

很抱歉,这个冗长的问题。第一次发布。

1 个答案:

答案 0 :(得分:1)


我尽力理解您的问题,但是您对示例答案感到困惑。
df-b中的所有ID均不应删除。即使对于df-b的第3行,日期(2020-06-10)也不属于df-a中ID cd2的任何开始/结束日期的范围。

我确实为您提供的df-a提供了类似的示例:
    ID       Start_Date    End_Date
0   cd2      2020-06-01    2020-06-11
1   cd2      2020-06-24    2020-07-21
2   cd56     2020-06-10    2020-07-03
3   cd915    2020-04-28    2020-07-21
4   cd103    2020-04-13    2020-04-24

和df-b为:

    ID      Date
0   cd2     2020-05-12
1   cd2     2020-04-12
2   cd2     2020-06-10
3   cd15    2020-04-28
4   cd193   2020-04-13

在此示例中,应该删除df-b的第2行(从0开始),因为2020-06-10介于df-a的第0行的2020-06-01和2020-06-11之间。

这是我的行删除代码

df_c = df_b.copy()

for i in range(df_c.shape[0]):
    currentID = df_c.ID[i]
    currentDate = df_c.Date[i]
    df_a_entriesForCurrentID = df_a.loc[df_a.ID == currentID]
    
    for j in range(df_a_entriesForCurrentID.shape[0]):
        startDate = df_a_entriesForCurrentID.iloc[j,:].Start_Date
        endDate = df_a_entriesForCurrentID.iloc[j,:].End_Date
        
        if (startDate <= currentDate <= endDate):
            df_c = df_c.drop(i)
            print('dropped')

其中df_c是输出DataFrame。

运行此命令后,df_c应该如下所示:

    ID     Date
0   cd2    2020-05-12
1   cd2    2020-04-12
3   cd15   2020-04-28
4   cd193  2020-04-13