嗨我有一个数据帧如下,有数千个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
答案 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