在ID

时间:2018-03-22 19:48:42

标签: python pandas

我想在PANDAS 3.5中使用以下解决方案。我在之前的帖子中有SQL的部分解决方案。

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

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

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

当删除一个subid时,我希望它有一个额外的行,is_removed列在实际删除的日期= 1。示例输入/输出数据帧如下。感谢。

示例输入数据帧:

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

示例输出:

ID  SUBID   UPDDATE         IS_NEW  IS_REMOVED
1   a   2016-03-11    0   0
1   b   2016-03-11    0   0
1   c   2016-03-11    0   0
1   a   2016-03-12    0   0
1   b   2016-03-12    0   0
1   c   2016-03-12    0   0
1   d   2016-03-12    1   0
1   a   2016-03-13    0   0
1   b   2016-03-13    0   0
1   c   2016-03-13    0   1
1   d   2016-03-13    0   0

1 个答案:

答案 0 :(得分:0)

您可以通过一种方式执行此操作并在使用pd.crosstab时可视化结果:

df_out = pd.crosstab([df['ID'],df['Date']],df['Sub Id'])

df_diff = df_out.diff().fillna(0).stack()

pd.concat([df.set_index(['ID','Date','Sub Id']),
           df_diff.eq(1).mul(1).rename('IS_NEW'),
           df_diff.eq(-1).mul(1).rename('IS_REMOVED')],axis=1)\
  .reset_index()

输出:

    ID       Date Sub Id  IS_NEW  IS_REMOVED
0    1 2016-03-11      a       0           0
1    1 2016-03-11      b       0           0
2    1 2016-03-11      c       0           0
3    1 2016-03-11      d       0           0
4    1 2016-03-12      a       0           0
5    1 2016-03-12      b       0           0
6    1 2016-03-12      c       0           0
7    1 2016-03-12      d       1           0
8    1 2016-03-13      a       0           0
9    1 2016-03-13      b       0           0
10   1 2016-03-13      c       0           1
11   1 2016-03-13      d       0           0

可视化结果:

print(df_out)

Sub Id         a  b  c  d
ID Date                  
1  2016-03-11  1  1  1  0
   2016-03-12  1  1  1  1
   2016-03-13  1  1  0  1

print(df_out.diff().fillna(0))

Sub Id           a    b    c    d
ID Date                          
1  2016-03-11  0.0  0.0  0.0  0.0
   2016-03-12  0.0  0.0  0.0  1.0
   2016-03-13  0.0  0.0 -1.0  0.0