微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重复应用过滤器,直到条件用完Python

如何解决重复应用过滤器,直到条件用完Python

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

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

任意两行成对满足的条件是:

  1. 这两行具有相同的ITEM_ID;
  2. 这两行具有相同的VALUE;
  3. 前面的行为'TYPE == O',后面的行为'TYPE == I'

代码

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]
df

我可以通过重复应用几次过滤器来手动执行此操作,但是我不确定在条件耗尽之前需要应用多少次过滤器。我想知道是否可以使用while loop来做到这一点,也许像这样:


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)

但是,与手动执行该功能相比,运行该功能需要花费很长时间(几分钟并且仍在运行),总共只需要花费几秒钟。

解决方法

您可以将代码放入while循环中,并在MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); //Here image is the absolute path of the file you want to post FileBody fbd=new FileBody(new File(image)); builder.addPart("my_file",fbd); for (int index = 0; index < nameValuePairs.size(); index++) { builder.addPart(nameValuePairs.get(index).getName(),new StringBody(nameValuePairs.get(index).getValue(),ContentType.TEXT_PLAIN)); } DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url);//your url HttpEntity entity = builder.build(); httpPost.setEntity(entity); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); String response = httpEntity.getContent(); Welcometxt.setText("Welcome "); Welcometxt.setTextColor(Color.parseColor(getIntent().getStringExtra("Welcome"))); 相同时(即不再剩余匹配项)中断代码。

cur_length

输出:

new_length

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。