重复应用过滤器,直到Python中的条件耗尽

重复应用过滤器,直到Python中的条件耗尽,python,pandas,function,while-loop,Python,Pandas,Function,While Loop,我想通过反复删除满足某些条件的对来过滤数据帧,直到条件用尽为止 df: Date ITEM_ID TYPE VALUE 342874 2012-06-18 ECE240 O 1.0 342415 2012-06-18 ECE240 O 25.0 325718 2012-06-18 ECE240 O 1.0 334488 2012-06-18 ECE240 O 1.0 342412

我想通过反复删除满足某些条件的对来过滤数据帧,直到条件用尽为止

df

        Date        ITEM_ID TYPE    VALUE
342874  2012-06-18  ECE240  O       1.0 
342415  2012-06-18  ECE240  O       25.0
325718  2012-06-18  ECE240  O       1.0 
334488  2012-06-18  ECE240  O       1.0 
342412  2012-06-18  ECE240  O       25.0
341634  2012-06-18  ECE240  O       9.0
341996  2012-06-19  ECE240  O       2.0 
341747  2012-06-19  ECE240  O       1.0 
272185  2012-06-24  ECE240  I       1.0 
219     2012-06-24  ECE240  I       1.0 
6896    2012-06-24  ECE240  I       2.0 
351560  2012-06-24  ECE240  O       1.0 
312636  2012-06-26  ECE240  I       1.0 
2376    2012-06-30  ECE240  I       1.0 
350922  2012-07-02  ECE240  O       1.0 
270589  2012-07-09  ECE240  I       4.0
331689  2012-07-15  ECE240  I       1.0 
299912  2012-07-23  ECE240  I       1.0 
212418  2012-07-23  ECE240  I       3.0
3992    2012-07-24  ECE240  I       2.0
388937  2012-08-10  ECE240  O       10.0
124596  2012-08-18  ECE240  I       1.0 
368945  2012-08-19  ECE240  O       12.0
368944  2012-08-19  ECE240  O       6.0
239581  2012-08-24  ECE240  I       4.0
任何两行成对满足的条件为:

  • 这两行具有相同的
    项目ID
  • 两行具有相同的
  • 前面的行有'TYPE==O',后面的行有'TYPE==I'
  • 代码:

    我可以通过多次重复应用过滤器来手动完成,但我不确定在条件耗尽之前需要应用过滤器多少次。我想知道是否可以使用
    while循环来执行此操作,可能类似于:

    
    def myfunc(df):
    
        mask = df.sort_values('Date')\
        .groupby(['ITEM_ID', 'VALUE'])['TYPE']\
        .apply(lambda x: ((x == 'O') & (x.shift(-1) == 'I')) | (x == 'I') & (x.shift(1) == 'O'))
    
        df = df.loc[~mask]
    
        return df
    
    
    while True:
        myfunc(df)
    

    但是,与手动操作相比,运行该功能需要很长时间(几分钟后仍在运行),而手动操作总共只需要几秒钟。

    只要
    cur\u length
    new\u length
    相同,即不再存在匹配项,您就可以将代码放入while循环并中断代码

    def myfunc(df):
    
        mask = df.sort_values('Date')\
        .groupby(['ITEM_ID', 'VALUE'])['TYPE']\
        .apply(lambda x: ((x == 'O') & (x.shift(-1) == 'I')) | (x == 'I') & (x.shift(1) == 'O'))
        df = df.loc[~mask]
        return df
    
    
    while True:
        cur_length = len(df)
        df = myfunc(df)
        new_len = len(df)
        print(cur_length ,new_len)
        if cur_length == new_len:
            break
    df
    
    输出:

    Date    ITEM_ID TYPE    VALUE
    2012-06-18  ECE240  O   25.0
    2012-06-18  ECE240  O   25.0
    2012-06-18  ECE240  O   9.0
    2012-07-09  ECE240  I   4.0
    2012-07-23  ECE240  I   3.0
    2012-07-24  ECE240  I   2.0
    2012-08-10  ECE240  O   10.0
    2012-08-18  ECE240  I   1.0
    2012-08-19  ECE240  O   12.0
    2012-08-19  ECE240  O   6.0
    2012-08-24  ECE240  I   4.0
    

    只要
    old_df_length
    new_df_length
    相同,您就可以将代码放入while循环中并中断代码。@venky__,这是个好主意。您能告诉我如何捕获新的和旧的数据帧长度吗?
    Date    ITEM_ID TYPE    VALUE
    2012-06-18  ECE240  O   25.0
    2012-06-18  ECE240  O   25.0
    2012-06-18  ECE240  O   9.0
    2012-07-09  ECE240  I   4.0
    2012-07-23  ECE240  I   3.0
    2012-07-24  ECE240  I   2.0
    2012-08-10  ECE240  O   10.0
    2012-08-18  ECE240  I   1.0
    2012-08-19  ECE240  O   12.0
    2012-08-19  ECE240  O   6.0
    2012-08-24  ECE240  I   4.0