【问题标题】:Dropping rows from dataframe based on the value of the previous row根据前一行的值从数据框中删除行
【发布时间】:2019-11-20 22:21:35
【问题描述】:

我有一个如下的数据框:

2018-10-16 15:15:00 1810.388020
2018-10-16 15:20:00 1813.299467
2018-10-16 15:25:00 1812.550495
2018-10-16 15:45:00 18140.981919
2018-10-16 15:35:00 1814.473347
2018-10-16 15:40:00 1816.349779
2018-10-16 15:45:00 740.981919
2018-10-16 15:50:00 1819.066781
2018-10-16 15:55:00 1820.333191

我需要一个如下的数据框:

2018-10-16 15:15:00 1810.388020
2018-10-16 15:20:00 1813.299467
2018-10-16 15:25:00 1812.550495
2018-10-16 15:35:00 1814.473347
2018-10-16 15:40:00 1816.349779
2018-10-16 15:50:00 1819.066781
2018-10-16 15:55:00 1820.333191

即:对于每一行的值大于前行值的 1.5 或小于前行值的 0.5,将其删除

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    想法是比较前一个值和下一个值,通过| 链接按位OR,最后按位AND 并通过boolean indexing 过滤:

    m11 = df['col'] > df['col'].shift(-1) * 0.5
    m12 = df['col'] > df['col'].shift() * 0.5
    m21 = df['col'] < df['col'].shift(-1) * 1.5
    m22 = df['col'] < df['col'].shift() * 1.5
    
    df = df[(m11 | m12) & (m21 | m22)]
    print (df)
                                 col
    2018-10-16 15:15:00  1810.388020
    2018-10-16 15:20:00  1813.299467
    2018-10-16 15:25:00  1812.550495
    2018-10-16 15:35:00  1814.473347
    2018-10-16 15:40:00  1816.349779
    2018-10-16 15:50:00  1819.066781
    2018-10-16 15:55:00  1820.333191
    

    详情

    df['m11'] = df['col'] > df['col'].shift(-1) * 0.5
    df['m12'] = df['col'] > df['col'].shift() * 0.5
    df['m21'] = df['col'] < df['col'].shift(-1) * 1.5
    df['m22'] = df['col'] < df['col'].shift() * 1.5
    
    df['m1'] = (df['m11'] | df['m12'])
    df['m2'] = (df['m21'] | df['m22'])
    
    df['mask'] = df['m1'] & df['m2']
    
    print (df)
                                  col    m11    m12    m21    m22     m1     m2  \
    2018-10-16 15:15:00   1810.388020   True  False   True  False   True   True   
    2018-10-16 15:20:00   1813.299467   True   True   True   True   True   True   
    2018-10-16 15:25:00   1812.550495  False   True   True   True   True   True   
    2018-10-16 15:45:00  18140.981919   True   True  False  False   True  False   
    2018-10-16 15:35:00   1814.473347   True  False   True   True   True   True   
    2018-10-16 15:40:00   1816.349779   True   True  False   True   True   True   
    2018-10-16 15:45:00    740.981919  False  False   True   True  False   True   
    2018-10-16 15:50:00   1819.066781   True   True   True  False   True   True   
    2018-10-16 15:55:00   1820.333191  False   True  False   True   True   True   
    
                          mask  
    2018-10-16 15:15:00   True  
    2018-10-16 15:20:00   True  
    2018-10-16 15:25:00   True  
    2018-10-16 15:45:00  False  
    2018-10-16 15:35:00   True  
    2018-10-16 15:40:00   True  
    2018-10-16 15:45:00  False  
    2018-10-16 15:50:00   True  
    2018-10-16 15:55:00   True  
    

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      相关资源
      最近更新 更多