重复应用过滤器,直到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
李>
值
李>
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