首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个数据帧并根据多个条件删除行。

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

Stack Overflow用户
提问于 2020-08-19 09:18:22
回答 1查看 81关注 0票数 0

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

代码语言:javascript
复制
         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:

代码语言:javascript
复制
         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中所有ID的所有行,如果它们属于df中相同ID的不同日期范围。即回答

代码语言:javascript
复制
         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中唯一与df匹配的ID,其中一个日期在cd2的日期范围内,范围从df-a。

很抱歉提了个冗长的问题。第一次发帖。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-19 20:28:19

我尽了最大的努力去理解你的问题,但是我对你的回答很困惑。

df中的任何ID都不应该删除。即使对于df-b的第3行,日期(2020-06-10)也不属于df-a中ID cd2的任何开始/结束日期范围。

我确实建立了一个与你提供的df类似的例子-一个存在:

代码语言:javascript
复制
    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为:

代码语言:javascript
复制
    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之间。

这里是我执行行删除的代码

代码语言:javascript
复制
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应该如下所示:

代码语言:javascript
复制
    ID     Date
0   cd2    2020-05-12
1   cd2    2020-04-12
3   cd15   2020-04-28
4   cd193  2020-04-13
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63483800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档