标记ID中新添加的子ID

时间:2018-03-11 18:45:29

标签: oracle python-3.x pandas dataframe

嗨我有一个数据帧如下,有数千个ID。它有一个ID列表,其中包含子ID,如图所示。可以每天更改子标签,可以添加新的子标识,也可以丢失现有的子标识。

我需要创建2个新列,每当添加/丢失子ID时都会标记。

因此,在下面的格式中,您可以看到在12日,添加了一个新的子ID“D” 并且在13日,现有的子id(c)丢失了。 我想创建一个新的列/标志来跟踪这些子ID。你能帮帮我吗?

我使用的是Python 3.5。感谢

一个ID的样本格式:

ID Sub Id     Date     is_new  
1    a     3/11/2016      0
1    b     3/11/2016      0
1    c     3/11/2016      0
1    a     3/12/2016      0
1    b     3/12/2016      0
1    c     3/12/2016      0
1    d     3/12/2016      1
1    a     3/13/2016      0
1    b     3/13/2016      0
1    d     3/13/2016      0

1 个答案:

答案 0 :(得分:0)

下面的查询将指示添加或删除子ID的时间。希望这可以帮助。

  
      
  • 获取每个id的最大和最小更新日期,我将其放入临时表名称:min_max
  •   
  • 如果更新日期与min和max相同,则将其标记为1
  •   
  • 滞后和引导函数将获得每个ID的上一个和下一个子ID,
  • 的子命令   
  • 将所有内容放在子查询(表s)
  • 上   
  • 如果更新日期不是每个ID的开始日期或结束日期,则可以添加(is_mindte = 0)或删除(is_maxdte = 0)
  •   
  • 如果is_added列为null,则在该日期添加(is_added为null);如果is_deleted列为null,则删除下一个更新日期(is_added为null)
  •   
    select s.id,
       s.subid,
       s.upddate,
(case when is_mindte=0 and is_added is null 
      then 1 else 0 end ) is_new,
(case when is_maxdte=0 and is_deleted is null 
      then 1 else 0 end) is_removed
from (
   with min_max as
      (select   id,min(upddate) mindate,max(upddate) maxdate
       from     myTable
       group by id)
  select t.id,
         t.subid,
         t.upddate,
         case when t.upddate=m.mindate 
              then 1 else 0 end is_mindte,
         case when t.upddate=m.maxdate 
              then 1 else 0 end is_maxdte,
         lag(t.subid) over (partition by t.id, t.subid order by t.upddate) is_added,
         lead(t.subid) over (partition by t.id, t.subid order by t.upddate) is_deleted 
   from  myTable t, min_max m
   where t.id=m.id) s
order by s.id, 
      s.upddate, 
      s.subid

sample result:
ID  SUBID   UPDDATE         IS_NEW  IS_REMOVED
1   a   2016-03-11T00:00:00Z    0   0
1   b   2016-03-11T00:00:00Z    0   0
1   c   2016-03-11T00:00:00Z    0   0
1   a   2016-03-12T00:00:00Z    0   0
1   b   2016-03-12T00:00:00Z    0   0
1   c   2016-03-12T00:00:00Z    0   1
1   d   2016-03-12T00:00:00Z    1   0
1   a   2016-03-13T00:00:00Z    0   0
1   b   2016-03-13T00:00:00Z    0   0
1   d   2016-03-13T00:00:00Z    0   0
2   a   2016-03-11T00:00:00Z    0   0
2   b   2016-03-11T00:00:00Z    0   0
2   c   2016-03-11T00:00:00Z    0   0