我想在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
答案 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