Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >两种数据格式的高效逐行比较

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

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

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

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

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

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

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

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

代码语言:javascript
运行
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
运行
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
运行
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
运行
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
运行
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

复制
相关文章
工作角色与家庭角色冲突
2020 年的工作正式开启,大多数开发者的开工方式是云办公。对开发者来说,云办公意味着什么?如何开始云办公?云办公的发展趋势会怎样?基于此,云加社区联手知乎科技,从知乎云办公相关话题中精选内容落地社区专题「 开发者云办公模式洞察 」。
腾讯云开发者社区
2020/03/20
1.3K0
Rails里应用Devise
Use Devise For Authentication Devise is great gem for authentication, check out here. Add Gem First thing you need to do is to add devise gem to you Gemfile. Just add gem 'devise', '~> 3.5' to your Gemfile and run bundle install and restart your server. Se
用户2183996
2018/06/28
3500
MySQL管理——激活角色
MySQL8.0提供了角色功能,用户需要在激活角色后才能够使用角色赋予的权限。角色可以在服务器、用户和会话三个级别进行激活。用户仅能激活已被授予的角色
MySQLSE
2023/08/31
5240
MySQL管理——激活角色
OpenShift-角色管理
集群级别Role(Cluster Role) admin:可管理除了项目quota外其它所有项目包括的资源对象。 basic-user:可以获得项目和用户的基本信息。 cluster-admin:可以对任何项目进行任何操作。 cluster-status:可以获得集群状态信息的角色。 edit:除了Role和Binding外,可以修改项目中其它对象。 self-provisioner:可以创建属于自己的项目。 view:不能对项目中的对象进行任何更改,但是可以查看项目中的对象 oc get c
heidsoft
2021/08/26
7650
OpenShift-角色管理
为什么游戏角色没有胡子?
点击标题下「大数据文摘」可快捷关注 福布斯中文网授权转载 本文作者JV Chamary是生物学家和作家。 译 于波 校 李其奇 摘自:福布斯中文网(微信公号: forbeschinaonline) 很多角色扮演游戏都允许玩家定制游戏人物的面部特征,由《光晕》(Halo)这款游戏的创造者开发的新款“共享世界射击游戏”也不例外。 在选择种族(人类、觉醒者或Exo机械族)后,你可以调整包括脸型、发型、眼睛颜色和肤色在内的所有面部特征,创造出独一无二的游戏人物。只不过缺少了一样东西:胡子。 从《命运》的Beta测试
大数据文摘
2018/05/22
9880
【学生管理系统】权限管理之角色管理
   @PostMapping("/addPerm")    public BaseResult addPermWithRoleId(@RequestBody SysRole sysRole) {        try {            // 添加权限            sysRolePermissionService.addPermWithRoleId(sysRole); ​            // 提示            return BaseResult.ok("授权成功");       } catch (Exception e) {            return BaseResult.error("授权失败");       } ​   }
陶然同学
2023/02/24
1.9K0
【学生管理系统】权限管理之角色管理
MySQL8.0 角色管理
官方文档的第一句话,就开门见山的告诉了我们角色是什么东西。A MySQL role is a named collection of privileges. Like user accounts, roles can have privileges granted to and revoked from them.
AsiaYe
2021/11/25
1.6K0
造轮子之角色管理
在asp.net core identity中已经有RoleManager,我们只需要封装一下API操作Role即可完成我们角色管理相关功能,这里API打算只提供分页查询,创建以及删除,不提供修改API。
饭勺oO
2023/10/18
1610
Oracle 用户、角色管理简介
3)DEFAULT TABLESPACE testtbs001:指定在用户方案(schema)中创建的对象的默认表空间为testtbs001
授客
2019/09/11
1.2K0
Grafana -- 用户角色管理(三)
在日常 Grafana 使用中需要针对不同用户开放不同的 dashboard 权限,根据不同角色进行权限管理。Grafana 角色大致分为以下三类:
Kevin song
2020/11/06
5.6K0
那些数据工作中的角色
数据工作中有一类非常重要的角色,那就是数据分析师。为什么这个角色这么重要呢?因为要是没有这个角色,不管一个企业中的数据管理做得有多么好都没用,都无法带来实际的价值。这些数据就像是藏在海底的石油,而数据分析师就是开采海底石油的油井设备。要想让石油用于汽车轮船,需要通过这些设备先将海底的石油抽取出来,经过加工处理,提纯。
ThoughtWorks
2021/07/02
4780
PostgreSQL用户角色和权限管理
4、任何属于该组角色的对象都必须先被删除或者将对象的所有者赋予其它角色,任何赋予该组角色的权限也都必须被撤消。
数据和云
2022/02/25
4.8K0
PostgreSQL用户角色和权限管理
MySQL 8.0用户和角色管理
MySQL8.0新加了很多功能,其中在用户管理中增加了角色的管理,默认的密码加密方式也做了调整,由之前的sha1改为了sha2,同时加上5.7的禁用用户和用户过期的设置,这样方面用户的管理和权限的管理,也增加了用户的安全性。
田帅萌
2018/08/14
2.9K0
MySQL 8.0用户和角色管理
SQLServer 服务器角色管理
常用的为:db_datareader(查权限)db_datawriter(增删改权限)db_owner(完全权限)
李郑
2019/12/04
3.1K0
基于Python-Flask的权限管理:角色管理
一、前言 角色管理主要管理角色信息,不同的角色可以访问不同的菜单和数据。 image 二、后端实现 1.ORM类 from db import db from models.BaseModel imp
Python之道
2020/06/02
4K1
基于Python-Flask的权限管理:角色管理
POJ 1936 All in All
You have devised a new encryption technique which encodes a message by inserting between its characters randomly generated strings in a clever way. Because of pending patent issues we will not discuss in detail how the strings are generated and inserted into the original message. To validate your method, however, it is necessary to write a program that checks if the message is really encoded in the final string.
谙忆
2021/01/19
3920
​MySQL8.0角色管理---(三)
类似将角色授予账户一样,我们可以使用revoke的方法从账户中撤销角色,下面我们演示从账号yeyz_ro中撤销角色role_ro角色:
AsiaYe
2020/02/25
7030
MongoDB运维与开发(五)---角色管理
之前的两篇文章,我们已经讲清楚了MongoDB的用户权限管理,接下来的文章我们来看MongoDB的角色管理。
AsiaYe
2020/11/10
9010
MongoDB运维与开发(五)---角色管理
MySQL8.0角色管理---(一)
今天看了看MySQL8.0官方文档的角色管理部分,写点东西总结下这块的内容吧。
AsiaYe
2020/02/25
5870
技术转管理(一):角色的转变认知
祝大家国庆假期节日快乐哈。因厦门疫情比较严重,今年国庆就乖乖的宅家里啦,今天和大家聊一聊程序员如何转型做管理。
用户7533190
2022/09/22
8550
技术转管理(一):角色的转变认知

相似问题

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

12

根据标题类型显示内容

11

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

20

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

20

显示内容自定义页面

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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