如何有条件地删除熊猫中的行

Sla*_*ast 5 python pandas

我有以下数据框:

        True_False  cum_val
Date        
2018-01-02  False   NaN
2018-01-03  False   0.006399
2018-01-04  False   0.010427
2018-01-05  False   0.017461
2018-01-08  False   0.019124
2018-01-09  False   0.020426
2018-01-10  False   0.019314
2018-01-11  False   0.026348
2018-01-12  False   0.033098
2018-01-16  False   0.029573
2018-01-17  False   0.038988
2018-01-18  False   0.037372
2018-01-19  False   0.041757
2018-01-22  False   0.049824
2018-01-23  False   0.051998
2018-01-24  False   0.051438
2018-01-25  False   0.052041
2018-01-26  False   0.063882
2018-01-29  False   0.057150
2018-01-30  True    -0.010899
2018-01-31  True    -0.010410
2018-02-01  True    -0.011058
2018-02-02  True    -0.032266
2018-02-05  True    -0.073246
2018-02-06  True    -0.055805
2018-02-07  True    -0.060806
2018-02-08  True    -0.098343
2018-02-09  True    -0.083407
2018-02-12  False   0.013915
2018-02-13  False   0.016528
2018-02-14  False   0.029930
2018-02-15  False   0.041999
2018-02-16  False   0.042373
2018-02-20  False   0.036531
2018-02-21  False   0.031035
2018-03-06  False   0.013671
Run Code Online (Sandbox Code Playgroud)

如何在False所有值之后删除行第二个True值直到第二个True Value直到第二个False

例如:

    True_False  cum_val
Date        
2020-01-21  False   0.022808
2020-01-22  False   0.023097
2020-01-23  True    0.001141
2020-01-24  True    -0.007901 # <- Start drop here since this is the second True
2020-01-27  True    -0.023632
2020-01-28  False -0.013578
2020-01-29  False -0.000867 #< - End Drop Here Since this is the second False
2020-01-30  False 0.003134 
Run Code Online (Sandbox Code Playgroud)

编辑1:

我想在新的 df 上再添加 1 个条件:

2020-01-22  0.000289    False   
2020-01-23  0.001141    True    
2020-01-27  -0.015731   True    # <- Start Drop Here
2020-01-28  0.010054    True    
2020-01-29  -0.000867   False   
2020-01-30  0.003134    True    #<-End drop here
2020-02-03  0.007255    True    
Run Code Online (Sandbox Code Playgroud)

正如您在评论中提到的:[真,真,真,假,真]

在这种情况下,它仍会在第二个True值处开始下降,但会在第一个False值之后立即停止下降,即使第二个值已切换为True。如果下一个值仍然True下降到之后的值False

Sco*_*ton 6

让我们尝试使用wherewithffill和参数limit=2然后布尔过滤:

df[~(df['True_False'].where(df['True_False']).ffill(limit=2).cumsum() > 1)]
Run Code Online (Sandbox Code Playgroud)

输出:

|    | Date       | True_False   |   cum_val |
|----|------------|--------------|-----------|
|  0 | 2020-01-21 | False        |         1 |
|  1 | 2020-01-22 | False        |         2 |
|  2 | 2020-01-23 | True         |         3 |
|  7 | 2020-01-28 | False        |         8 |
Run Code Online (Sandbox Code Playgroud)

细节:

  • 首先让我们将 False 转换为 np.nan 使用 where
  • 接下来,在最后一个 True 之后填充前两个 np.nan 使用 ffill(limit=2)
  • 现在,让我们使用,cumsum这样我们就可以添加连续的 True 并选择大于 2 的那些
  • 和 negate,在第一个 True 记录和第三个 False 记录之上保留虚假记录,以此类推。