标记Pandas DataFrame中的列从0到行逐行更改

时间:2019-04-13 10:20:33

标签: python pandas dataframe

在此示例中,我有一个包含两列primeprime2的数据集,我想检查逐行样式的更改:

>>> 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()

如果有任何疑问,请随时感谢您的帮助。

1 个答案:

答案 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列,这将更加困难,但是对于您的示例来说,就足够了