Pandas 日复一日地排除具有某些值的ID

Pandas 日复一日地排除具有某些值的ID,pandas,Pandas,我有这个df: ID Date X Y A 16-07-19 123 56 A 17-07-19 456 84 A 18-07-19 0 58 A 19-07-19 123 81 B 19-07-19 456 70 B 21-07-19 789 46 B 22-07-19 0 19 B 23-07-19 0 91 C 14-07-19 0 86 C 16-07-19 456 91

我有这个df:

ID      Date    X   Y
 A  16-07-19  123  56
 A  17-07-19  456  84
 A  18-07-19    0  58
 A  19-07-19  123  81
 B  19-07-19  456  70
 B  21-07-19  789  46
 B  22-07-19    0  19
 B  23-07-19    0  91
 C  14-07-19    0  86
 C  16-07-19  456  91
 C  17-07-19  456  86
 C  18-07-19    0  41
 C  19-07-19  456  26
 C  20-07-19  456  17
 D  06-07-19  789  98
 D  08-07-19  789  90
 D  09-07-19    0  94
我想逐日排除在
X
中有任何值的ID(除了
0

例如:
A
16-07-19
上的值为
123
,在
17-07-19
上的值为
456
。因此,应排除所有
A
的观察结果

预期结果:

ID      Date    X   Y
 B  19-07-19  456  70
 B  21-07-19  789  46
 B  22-07-19    0  19
 B  23-07-19    0  91
 D  06-07-19  789  98
 D  08-07-19  789  90
 D  09-07-19    0  94

让我们以矢量化的方式来实现这一点,以尽可能保持代码的效率 (意思是:我们避免使用
GroupBy.apply

  • 首先,我们检查
    Date
    中的差异是否等于
    1天
  • 我们检查
    X
    列是否
    不等于
    0
  • 我们创建一个临时列
    m
    ,检查这两个条件是否都为
    True
  • 我们在
    ID
    groupby
    并删除
    行中任何
    True
  • #df['Date']=pd.to_datetime(df['Date'])
    
    # df['Date'] = pd.to_datetime(df['Date'])  <- if Date is not datetime type
    
    m1 = df['Date'].diff(1).eq(pd.Timedelta(1, unit='d'))
    m2 = df['X'].ne(0)
    
    df['m'] = m1&m2
    
    df = df[~df.groupby('ID')['m'].transform('any')].drop(columns='m')
    
       ID       Date    X   Y
    4   B 2019-07-19  456  70
    5   B 2019-07-21  789  46
    6   B 2019-07-22  0    19
    7   B 2019-07-23  0    91
    14  D 2019-06-07  789  98
    15  D 2019-08-07  789  90
    16  D 2019-09-07  0    94