首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >两种数据格式的高效逐行比较

两种数据格式的高效逐行比较
EN

Stack Overflow用户
提问于 2018-07-25 06:15:28
回答 1查看 478关注 0票数 2

我正以一种逐行的方式比较两个数据格式。

对于data中的每一行,我希望检查reference中是否有匹配的行。

要使匹配被认为是正确的,必须充分提出一些条件:

  1. 我希望两行中的非空值的数目相同(这样我就不会在数据中得到来自行的假阳性,只匹配引用行的一部分)。
  2. 我希望避免比较NaN值,所以只比较行中包含实际值的部分(因此第一个条件必须为真)。
  3. 在进行比较时,我希望允许一些容忍(我正在使用np.isclose )
  4. 我要密码快一点

当找到匹配时,我会在列表中追加两行的名称。如果没有匹配,我将数据中的行名附加到"not“,与上面的列表相同。最后,我创建了一个汇总表,以查看哪一行与什么对应(或不对应)。

为了让您了解我的数据流的结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    name    col1    col2    col3    col4    col5    col6    col7    col8        
0     X       10     20      30      40      50      60      70      80 
1     X       20     30      NaN     NaN     NaN     NaN     NaN     NaN
2     X       10     25      30      50      NaN     NaN     NaN     NaN
3     X       20     25      30      50      NaN     NaN     NaN     NaN
  • 我的数据有130列
  • 大多数情况下,它们的数值在2到20个之间,其余的是NaNs。
  • 在每一行中,数字值在行的开头按升序排序,NaNs在行的末尾。

我有一个使用2 for-循环的工作代码,但是在大数据文件上使用它是相当慢的(这里我在一些‘示例’数据格式上测试代码):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = pd.DataFrame({'name':['read 1','read 2','read 3','read 4'],
                  'start 1':[100,102,100,103],
                  'end 1':[198,504,500,200],
                  'start 2':[np.NaN,600,650,601],
                  'end 2':[np.NaN,699, 700,702],
                  'start 3':[np.NaN,800,800,np.NaN],
                  'end 3':[np.NaN,901, 900,np.NaN]}, 
                   columns=['name', 'start 1', 'end 1', 'start 2', 'end 2', 'start 3', 'end 3'], 
                   dtype='float64')


reference = pd.DataFrame({'name':['a-1','a-2','b-1','c-1'],
                  'start 1':[100,100,100,300],
                  'end 1':[200,200,500,400],
                  'start 2':[300,np.NaN,600,600],
                  'end 2':[400,np.NaN, 700,700],
                  'start 3':[np.NaN,np.NaN,800,np.NaN],
                  'end 3':[np.NaN,np.NaN, 900,np.NaN]}, 
                   columns=['name', 'start 1', 'end 1', 'start 2', 'end 2', 'start 3', 'end 3'], 
                   dtype='float64')



match = []
checklist = set()

for read in data.itertuples():

    ndata = np.count_nonzero(~np.isnan(read[2:]),axis=0)

    end = ndata+1 if ndata>2 and  read[1] not in checklist else 4

    for ref in reference.itertuples():

        nref = np.count_nonzero(~np.isnan(ref[2:]),axis=0)

        if np.isclose(read[2:end],ref[2:end], atol=5).all() == True and ndata == nref:
            match.append([read[1], ref[1]])
            checklist.add(read[1])
            break

    if read[1] not in checklist:
        match.append([read[1], "not found"])
        checklist.add(read[1])     

match_table = pd.DataFrame(match)


match_table:

    read name     reference
0     read 1         a-2
1     read 2         b-1
2     read 3      not found
3     read 4      not found

所以我决定尝试用矢量化来优化它。现在,我只使用了1 for -循环,并且能够用np.isclose将第三个条件矢量化,但没有对其他条件进行管理。

我可以通过允许equal_nan=True来绕过它,但是由于我的大多数行都将满是NaN值,我认为如果不需要进行这些比较,我会得到一些时间。

到目前为止,我得到的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
count = []

for read in data.itertuples(index=False):

    idx = np.argwhere(np.isclose(read[1:], reference.iloc[:,1:], atol=5, equal_nan=True).all(axis=1) == True).flatten()

    if idx.size == 0:
        count.append([read[0], "not found"]) 
    else:
        idx = idx.item()
        count.append([read[0], reference['name'][idx]])

match = pd.DataFrame(count)

我用一个400×130个data数据帧在25×130个reference数据框架上测试了它,它的执行速度是第一个版本的6倍,但仍然需要1s才能完成。但也许没有多少改进的余地。

问题:

  • 如何将处理条件1和2的操作矢量化,允许不执行NaN比较?
  • 有可能摆脱内部循环吗?如果是的话,这是否允许获得更快的速度?

奖金问题:

为什么我必须在代码的第1版和第2版之间将索引从read[1]更改为read[0],才能选择['name']列?在一个版本中,它是基于0的,而在另一个版本中,它不是,或者类似的。但作为刚接触蟒蛇和自学的人,我真的不明白这里发生了什么..

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 05:31:09

可以通过使用df.apply来避免循环。itertuples是缓慢的,只有在绝对必要时才应该使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# index-setting not technically required, but makes the 
# rest of the code simpler
data = data.set_index('name')
reference = reference.set_index('name')

# define a helper function to use with apply
# taking the same logic as you have used
def get_ref(x):
    m = np.isclose(x, reference.values, atol=5, equal_nan=True).all(axis=1)
    return reference.index[m].item() if m.any() else np.nan

out = data.apply(get_ref, axis=1).rename('reference').reset_index()
# Outputs:
     name reference
0  read 1       a-2
1  read 2       b-1
2  read 3       NaN
3  read 4       NaN

如果深入到numpy层&用户np.apply_along_axis,您可以获得额外的速度提升。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.DataFrame({'read name': data.index,
              'reference': np.apply_along_axis(get_ref, 1, data.values)}

计时:

在我的机器上,带着样本数据

  • numpy版本需要920微秒
  • 大熊猫申请签证需要1.35毫秒
  • 您的优化版本需要2.20毫秒
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51521171

复制
相关文章
Django自定义全局403、404、500错误页面
使用{{ exception }}即可捕获异常信息,转换为html代码{{ exception|safe }},可以根据这些代码中的id等,得到跳转的链接,参考
菲宇
2019/07/31
1.5K0
spring-security 401 403错误自定义处理
但是一些框架,比如本文要说的spring-security是不按照我们自定义规范处理的,幸运的是spring-security框架给了我们可以定制化的地方,只需继承ResourceServerConfigurerAdapter,重写public void configure(ResourceServerSecurityConfigurer resources) throws Exception方法即可,在里面添加自定义的针对授权时返回的401以及403错误码,具体如下:
johnhuster的分享
2022/03/28
1.9K0
wget404错误_错误403谷歌
Resolving s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com)… 52.219.8.176 Connecting to s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com)|52.219.8.176|:443… connected. HTTP request sent, awaiting response… 403 Forbidden
全栈程序员站长
2022/11/15
1.7K0
SpringBoot自定义错误页面
然后你只需要写个controller拦截不同请求然后跳到不同的自定义错误页面即可,如下所示:
一写代码就开心
2020/11/20
1.3K0
springboot自定义错误页面
springboot自定义错误页面 1.加入配置: @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return (container -> { ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/401.html"); ErrorPage error404Pa
Dream城堡
2018/09/10
1K0
SpringBoot自定义错误页面
Spring Boot以一种新的微服务的方式来替代以Spring Framework构建项目的传统方式,我已经计划在后续的项目开发中使用它。它已经帮我们做了90%的工作,剩下10%的工作需要我们自己去完成。对于我来说,自定义错误页面就是其中之一。比如404错误,如果不处理的话,会出现“This application has no explicit mapping for /error, so you are seeing this as a fallback.”的错误信息,如图所示:
似水的流年
2019/12/07
1.3K0
axios django CSRF 403错误
使用axios直接post django的接口的时候会提示CSRF 403错误 可以在post的data中转入csrftoken 也可以给单个方法关闭 from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_exempt def test(request): pass
小贝壳
2020/03/05
1.4K0
springboot 自定义错误页面
Spring Boot 默认使用嵌入式 Tomcat,默认没有页面来处理404等常见错误。因此,为了给用户最佳的使用体验,404等常见错误需要我们自定义页面来处理。
BUG弄潮儿
2022/02/10
8610
springboot 自定义错误页面
DirectAdmin:自定义错误页面
步骤:控制面板首页 => 自定义错误页面,即可进入错误页面管理, 如点击进入404.shtml,修改后,保存即可
星哥玩云
2022/08/13
5840
DirectAdmin:自定义错误页面
SpringBoot自定义错误页面
Spring Boot以一种新的微服务的方式来替代以Spring Framework构建项目的传统方式,我已经计划在后续的项目开发中使用它。它已经帮我们做了90%的工作,剩下10%的工作需要我们自己去
似水的流年
2018/04/17
1.5K0
SpringBoot自定义错误页面
Nginx错误页面优雅显示的配置
一.Nginx错误页面优雅显示的原因?   当我们访问网站时,由于特殊的原因,经常会出现诸如403,404,503等错误,这极大的影响用户的访问体验,所以我们很有必要做一下错误页面的优雅显示,以提升用户的浏览体验。
星哥玩云
2022/06/29
1.6K0
Nginx 烦人的 403 错误
但是你就是老看到一个 403 的错误,这个绝大部分情况是因为 SELinux 造成的。
HoneyMoose
2022/07/06
6270
Nginx 烦人的 403 错误
nginx报403 forbidden错误
403 forbidden错误大家应该都熟悉,文件禁止访问,可能是权限问题,也可能是系统问题
opencode
2022/12/26
2.6K0
.net自定义错误页面实现
  在实际的web开发中,经常会遇到以下情况,导致给用不好的体验:     a、程序未处理的异常,直接输出显示到用户页面     b、用户访问的资源不存在,直接显示系统默认的404页面     c、其它以下请求错误状态的系统默认页面(403等)   为了给用户友好的体验,在实际项目开发中, 需要对系统会不同的异常定制相应的友好提示页面
小小许
2018/09/20
1.3K0
SpringBoot自定义错误页面面
实现ErrorController接口 package com.jmy.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bi
姜同学
2022/10/27
4290
SpringBoot thymeleaf自定义错误页面
导入thymeleaf pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 自定义异常类 建立监听异常类 MyException.class package com.example.demo.domain; public class MyException extends Ru
憧憬博客
2020/07/21
1.2K0
laravel自定义错误页面 原
app\Exceptions\handler.php 在render的时候就携带了这个异常
domain0
2018/08/02
9870
1.自定义错误页面
本文最后更新于 908 天前,其中的信息可能已经有所发展或是发生改变。 1.SpringBot 默认的处理异常的机制 一旦程序中出现了异常,SpringBoot会向/error的url发送请求。在 springBot 中提供了一个叫BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。 image.png 2.修改默认页面 在src/main/resources/templates目录下创建 error.html 页面。注:名称必须叫 err
Yuyy
2022/06/28
2820
1.自定义错误页面
SpringSecurity配置403权限访问页面
1、未配置之前 图片 2、开始配置 2.1 新建一个unauth.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>没有访问的权限</h1> </body> </html> 2.2 在继承WebSecurityConfigurerAdapter的配置类中设置 关键代码: //配置没有权限访问自定义跳转的页面 http.ex
别团等shy哥发育
2023/03/06
1.6K0
SpringSecurity配置403权限访问页面
点击加载更多

相似问题

Cakephp 403错误不显示自定义页面

12

根据标题类型显示内容

11

自定义错误页面内容未正确显示

20

根据索引页面上的内容类型自定义节点的内容块

20

显示内容自定义页面

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文