在此示例中,我有一个包含两列prime
和prime2
的数据集,我想检查逐行样式的更改:
>>> df = pd.DataFrame({'id_police':['p123','p123','p123','b123','b123'],
'date':['24/01/2017','24/11/2017','25/02/2018','24/02/2018','24/03/2018'],
'prime':[0,0,10,20,30],
'prime2':[0,30,10,20,0],
})
###
id_police date prime prime2
0 p123 24/01/2017 0 0
1 p123 24/11/2017 0 30
2 p123 25/02/2018 10 10
3 b123 24/02/2018 20 20
4 b123 24/03/2018 30 0
这是预期的结果(如果两列发生更改,则标记为0以外的任何值,并将它们添加到更改的位置,并且还有10列,例如prime和prime2):
id_police date prime prime2 changed changedwhere(optional)
0 p123 24/01/2017 0 0<- 0 nan
1 p123 24/11/2017 0<- 30<- 1 prime2
2 p123 25/02/2018 10<- 10 1 prime
3 b123 24/02/2018 20 20 0 nan
4 b123 24/03/2018 30 0 0 nan
我尝试过的方法,但它在所有列中都显示:
df.diff()
如果有任何疑问,请随时感谢您的帮助。
答案 0 :(得分:1)
我们可以在Series.eq
上使用axis=1
并将其与.shift
结合使用,以检查上一行,如下所示:
df['changed'] = (df[['prime', 'prime2']].shift().eq(0).any(axis=1) & df[['prime', 'prime2']].ne(0).any(axis=1)).astype(int)
print(df)
id_police date prime prime2 changed
0 p123 24/01/2017 0 0 0
1 p123 24/11/2017 0 30 1
2 p123 25/02/2018 10 10 1
3 b123 24/02/2018 20 20 0
4 b123 24/03/2018 30 0 0
注意,如果您有10列,这将更加困难,但是对于您的示例来说,就足够了