在Python中选择每个客户端的当前行和上一行

在Python中选择每个客户端的当前行和上一行,python,pandas,dataframe,numpy,group-by,Python,Pandas,Dataframe,Numpy,Group By,我的数据框架如下所示,我希望为每个客户机提取行,其中Flag=1,并为同一客户机提取前一行(如果存在)。例如,第1行(我从1开始,不是0),2,3,6,7,8,10,11,12 report_date customer_id Flag 01/01/20 1 0 02/01/20 1 1 03/01/20 1

我的数据框架如下所示,我希望为每个客户机提取行,其中Flag=1,并为同一客户机提取前一行(如果存在)。例如,第1行(我从1开始,不是0),2,3,6,7,8,10,11,12

   report_date  customer_id           Flag 

01/01/20                1               0
02/01/20                1               1
03/01/20                1               1
04/01/20                1               0
05/01/20                1               0
01/01/20                2               0
02/01/20                2               1
03/01/20                2               1
04/01/20                2               0
01/01/20                3               0
02/01/20                3               1     
03/01/20                3               1
04/01/20                3               0
05/01/20                3               0
06/01/20                3               0
07/01/20                3               0
 
用于按组移动值,并与
1
进行比较,对于按位
的列,则按
|
进行链比较:

df['prev'] = df.groupby('customer_id')['Flag'].shift(-1).eq(1) | df['Flag'].eq(1)
df['next'] = df.groupby('customer_id')['Flag'].shift().eq(1) | df['Flag'].eq(1)
print (df)
   report_date  customer_id  Flag   prev   next
0     01/01/20            1     0   True  False
1     02/01/20            1     1   True   True
2     03/01/20            1     1   True   True
3     04/01/20            1     0  False   True
4     05/01/20            1     0  False  False
5     01/01/20            2     0   True  False
6     02/01/20            2     1   True   True
7     03/01/20            2     1   True   True
8     04/01/20            2     0  False   True
9     01/01/20            3     0   True  False
10    02/01/20            3     1   True   True
11    03/01/20            3     1   True   True
12    04/01/20            3     0  False   True
13    05/01/20            3     0  False  False
14    06/01/20            3     0  False  False
15    07/01/20            3     0  False  False