教练!我不想遍历了!——用bool运算有效减少dataframe的时间复杂度
方法参考:python - 降低python for循环的时间复杂度 - 堆栈内存溢出 (stackoom.com)
朋友们,朋友们,事情是这样的。
这几天博主在处理数据的时候遇到了这样的标注数据:
| 文章编号 | 内容 | 是否是摘要 | |
| 1 | A1 | 我 | 0 |
| 2 | A1 | 是xx | 1 |
| .... | ...... | ....... | ....... |
| 100000 | A1044 | 啊哈 | 0 |
如上面这个表格所示,我们这里共计有100000条数据,我需要根据文章编号提取出每篇文章的内容,并且根据每篇文章的摘要标记(0为非摘要,1为是摘要),将摘要从数据中提取出来。每篇文章都有一篇对应的摘要。
于是,我原来的想法是这样的:
1.已知这批数据中共有1044篇文章,那么我上来就是一个for循环,将所有文章编号为A1至A1044的文章挑选出来。
2.然后结合后面的摘要label,分割出每篇文章的内容与摘要。
这样看来是个很简单的任务,好,那么我们只需要进行 1044*100000 ≈ 一亿次 循环就可以得到结果了,是不是很简单?
我真是¥#¥%#¥%#¥%*&(*&(&**&%* (广东粗口)
那么,为了不那么麻烦,我决定使用bool运算减少时间复杂度:
我们要做的事情其实很简单,首先先选择两个条件:
m1 = data['doc_id']+data['para_class'] == id_list[i]
m2 = data['abstract_type']==1
第一个条件是检查内容是否属于同一篇文章。
而第二个条件是检查这一内容token是否是摘要。
m1与m2是这一dataframe中每个元素对应于该条件的bool值索引。
那么如何使用这两个条件呢?也很简单:
contents = data['content'][m1].values abstracts = data['content'][(m1 & m2)].values
通过上面两行代码,我们就找到了dataframe中符合条件的值,并存入到了两个不同的列表中。
通过测试,计算的时间复杂度对比原来弱智又粗暴的for循环降低了不止一点。
下面贴上原代码与新代码的对比:
原代码:
import pandas as pd
data = pd.read_excel(r'C:\Users\1.xlsx')
print(data.head()) id_list = [] #初始化文章id列表
content_list = [] #初始化文章内容列表
abstract_list = [] #初始化摘要内容列表
'''
接下来的思路是这样的:
先从总的数据中提取出一个id列表;
id列表相同的,归到文章内容中
id列表相同,且摘要标记为1的,划到摘要内容中
''' #首先构造id列表
for i in range(len(data)):
if data['doc_id'][i]+data['para_class'][i] not in id_list:
id_list.append(data['doc_id'][i]+data['para_class'][i])
for i in range(len(id_list)):
#对id列表中的每一个id,我们都去对它构造文章内容,以及摘要内容,大工程,嗯
contents=''
abstracts=''
for j in range(len(data)):
if data['doc_id'][j] == id_list[i]:
try:
contents += data['content'][j]
except:
pass
if data['abstract_type'][j] == 1:
try:
abstracts += data['content'][j]
except:
pass
content_list.append(contents)
abstract_list.append(abstracts) df = pd.DataFrame({'abstract':abstract_list, 'content':content_list}) df.to_excel('Abstract_to_Article.xlsx', index=False)
改进后的代码:
import pandas as pd
data = pd.read_excel(r'C:\Users\c1.xlsx')
print(data.head()) id_list = [] #初始化文章id列表
content_list = [] #初始化文章内容列表
abstract_list = [] #初始化摘要内容列表
'''
接下来的思路是这样的:
先从总的数据中提取出一个id列表;
id列表相同的,归到文章内容中
id列表相同,且摘要标记为1的,划到摘要内容中
''' #首先构造id列表
for i in range(len(data)):
if data['doc_id'][i]+data['para_class'][i] not in id_list:
id_list.append(data['doc_id'][i]+data['para_class'][i]) for i in range(len(id_list)):
#对id列表中的每一个id,我们都去对它构造文章内容,以及摘要内容,大工程,嗯
contents=''
abstracts=''
for j in range(len(data)):
if data['doc_id'][j]+data['para_class'][j] == id_list[i]:
try:
contents += data['content'][j]
except:
pass
if data['abstract_type'][j] == 1:
try:
abstracts += data['content'][j]
except:
pass
content_list.append(contents)
abstract_list.append(abstracts)
教练!我不想遍历了!——用bool运算有效减少dataframe的时间复杂度的更多相关文章
- 迭代器遍历列表 构造方法 constructor ArrayList Vector LinkedList Array List 时间复杂度
package priceton; import java.io.IOException; import java.util.concurrent.CyclicBarrier; import java ...
- BOOL运算符号(从C#入门经典第五版中摘录)
只总结自己觉得难的哈: (1) var1=!var2; //(非) (2) var1=var2&var3; //(与) (3)var1=var2|var3; //(或) (4 ...
- Windows编程之模块遍历(C++实现)
Windows编程之模块遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历模块需要几个API,和一个结构体 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 API 分 ...
- 二进制与十进制的转化,bool str int 之间的转化,str的常用操作,
1.基础数据类型总览(7种) int: 整型,用于进行+-*/运算 str: 存储少量的数据;可加str,可乘数字,可切片,可进行9种常用操作 bool: True False 判断真假 list: ...
- Elasticsearch查询——布尔查询Bool Query
Elasticsearch在2.x版本的时候把filter查询给摘掉了,因此在query dsl里面已经找不到filter query了.其实es并没有完全抛弃filter query,而是它的设计与 ...
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property ...
- map的四种遍历方式
map是Java中非常常用的一种数据结构,但map不同于set和list都继承自Collection接口. 所以map没有实现Collection的Iterator 方法,自身没有迭代器来遍历元素. ...
- C# 遍历类的属性并取出值
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 今天有点胡思乱想,想遍历MVC Model的属性并 ...
- (转)LitJson 遍历key
本文转载自:http://blog.csdn.net/inlet511/article/details/47127579 用LitJson插件获取到的对象,如果想遍历对象中包含的子对象的key,可以用 ...
- Cocos2dx3.0过渡篇 各种遍历与范围for语句的使用【转】
1.CCArray的遍历看到这里,有些人又按耐不住的要举起西瓜刀了:你不是说3.0beta后已经没有CCArray这货了吗?现在又拿出来作甚?其实我也很无辜,CCArray确实是没了,但在某个不为人知 ...
随机推荐
- tuxedo 12c 安装
tuxedo12c 安装命令 静默安装 控制台安装 tuxedo版本介绍 Tuxedo Release Name Tuxedo Release Number Note which contains L ...
- Unity递归查找子物体
- vlan划分和设置
今天用ensp模拟一个交换机vlan的划分和设置 先上拓扑图: 目标要实现每台电脑都能相互ping通并且都能ping通1.1.1.1/30 简单分析一下,先看交换机sw3,sw3直接和路由器相连,要实 ...
- Checkmk监控工具使用手册
其实用法Checkmk官网文档很全面:https://docs.checkmk.com/latest/en/intro_setup.html 顺着beginner's guide章节看完基本就能上手, ...
- python通过轮子安装第三方库(以Wordcloud为例)
1.查看python版本 直接输入如下命令: python 执行结果如下: 我们可以直到,本机的python版本为: AMD64bit 3.11版本python 2.下载合适python版本的轮子 下 ...
- 痞子衡嵌入式:MCUXpresso IDE下生成镜像文件的方法及其与IAR,MDK差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下生成镜像文件的方法及其与IAR,MDK差异. 痞子衡很久以前写过一篇文章 <ARM Cortex-M ...
- CSPS2019 括号树 题解
链的部分分 我们设f[i]表示以i结尾的括号序列有多少个,那么i的实际答案就是f的前缀和 显然,所有左括号和不能匹配的右括号的f均为0 对于每一个能匹配的右括号i,我们找到与之匹配的左括号p,以i结尾 ...
- Docker教程、架构、资源
一.Docker教程 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...
- 穷人版生产力工具,好用得飞起 「GitHub 热点速览」
被 GPT 和 OpenAI 刷屏了一个多月,现在 GitHub Trending 已经没有什么和 gpt 无关的项目了,但是好在总有优秀的开源项目拯救我的项目疲惫.像是贴心好用的反向代理 pgrok ...
- Auto Photoshop StableDiffusion - 这是一款可以在 Photoshop 中使用 AI 智能 Automatic1111 进行插画、海报等设计的插件
简介 Auto Photoshop StableDiffusion - 这是一款可以在 Photoshop 中使用 AI 智能 Automatic1111 进行插画.海报等设计的插件,此插件可以是你在 ...