首页 > 其他分享 >教练!我不想遍历了!——用bool运算有效减少dataframe的时间复杂度

教练!我不想遍历了!——用bool运算有效减少dataframe的时间复杂度

时间:2022-08-19 17:12:12浏览次数:83  
标签:复杂度 摘要 list dataframe 列表 content bool data id

方法参考: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)

 

标签:复杂度,摘要,list,dataframe,列表,content,bool,data,id
From: https://www.cnblogs.com/LAKan/p/16474888.html

相关文章

  • 代码圈复杂度治理小结
    简介: 我们一直在说系统很复杂,那到底什么是系统复杂度呢?作为团队的稳定性底盘负责人,也经常和大家探讨为什么会因为圈复杂度高而被扣分。那么,怎么才能写的一手可读,可扩展,可......
  • #C220816C. 时间复杂度
    #C220816C.时间复杂度C220816C校内模拟赛背景注意:本题采用捆绑测试。题目描述在你的帮助下,小凯成功找到了宝藏价值最大的方案。接下来他在闲逛时被一个游戏机吸引了......
  • python pandas DataFrame 给列分裂 分两列或者多列
    怎么给pandasDataFrame格式的数据其中的列分成两列或者多列呢用df.map()和str.split()两个内置函数例如:1importpandasaspd2df=pd.DataFrame({'dateTime':['......
  • python | split函数时间复杂度
    源码while(maxcount-->0){while(i<str_len&&STRINGLIB_ISSPACE(str[i]))i++;if(i==str_len)break;j=i;i++;while(i<......