数据清洗(一):关联数据的替换

简介: 有时我们的数据里充满了各种简写或标记,而在处理、展示数据的过程中,我们需要的是数据各字段的详细名称,因此就需要对我们的数据集进行清洗与处理。前些天遇到一个某图书馆借阅数据,给出的要求是统计借阅图书的类别,数据里有每次借阅书籍的中图分类号,如"A122",'A'表示马列毛邓,'A1'表示马克思恩格斯著作,'A12'表示单行著作,'A122'表示1848~1863年间。

    有时我们的数据里充满了各种简写或标记,而在处理、展示数据的过程中,我们需要的是数据各字段的详细名称,因此就需要对我们的数据集进行清洗与处理。前些天遇到一个某图书馆借阅数据,给出的要求是统计借阅图书的类别,数据里有每次借阅书籍的中图分类号,如"A122",'A'表示马列毛邓,'A1'表示马克思恩格斯著作,'A12'表示单行著作,'A122'表示1848~1863年间。每一本书都有一个独立的分类号,按照需求只需要对分类号的第一个字母,也即分类号一级索引进行统计,并将统计结果里的字母用中文替换。因此这是一个入门级别的小任务,用Python就可以轻易的实现。

 

一、文件导入

    1.1 源文件

        源文件是一个80万行的Excel(囧),索引号在某一列下,我需要处理的数据大概有四万行。将其导入至sourceData.csv文件,便于读取,数据格式如下图。

    1.2 分类号-中文映射文件

        在百度上查询得到各分类号与中文名称之间的对应关系,存放在'中图分类法.txt'文件中。

    1.3 源代码

  1. with open('中图分类法.txt''r',encoding='GBK', errors='ignore') as f:  
  2.     bookFile = f.readlines()  
  3.     # print(bookFile)  
  4.     
  5. with open('sourceData.csv''r',encoding='GBK', errors='ignore') as f:  
  6.     dataFile = f.readlines()  
  7.     # print(dataFile)  

 

二、词频统计

    2.1 提取一级索引号

        我们按行读取的数据形如"I267/121",而我们只需要最开始的字母,因此提取每行第一个元素即可。统计词频我们可以声明一个字典变量,将每一个一级索引作为一个key,如果字典里有该key,则值+1,否则创建key.

  1. newdict = {}  
  2. for line in dataFile:  
  3.     # print(line[0])  
  4.     if line[0] in newdict:  
  5.         newdict[line[0]] += 1  
  6.     else:  
  7.         newdict[line[0]] = 1  

    2.2 字典排序

        为了后面能直观地看出各类别图书借阅数量的异同,我们在此将该字典按照值的大小降序排列。在此需要用上sorted(dic,value,reverse)函数。由于sorted函数并不改变原字典,所以需要接受该函数的返回值——排列后的列表。

  1. sortedDict = sorted(newdict.items(),key = lambda x:x[1],reverse = True)  

 

三、映射关系的替换

    3.1 分类号数据字典化

        由于分类号及其对应关系的数据为一行以逗号','隔开的文本,所以需要将其转换成字典。该数据行形如'A,马列毛邓',结尾还有一个换行符,为了将其变为字典,就需要在剔除换行符的情况下以逗号将其分隔为两个字符串。

  1. dict = {}  
  2. for line in bookFile:  
  3.     #print(line.strip().split(','))  
  4.     dict[line.strip().split(',')[0]] = line.strip().split(',')[1]  
  5. print(dict)  

    3.2 字符与文本的映射

        所以我们现在有两个变量,一个是存储了分类号与其对应中文的字典:{'A': '马列毛邓', 'B': '哲学宗教'...},一个是排序好的列表,列表元素为索引号及出现次数。我们现在需要将索引号替换为字典中对应索引号的值,将结果用两个变量表示(方便后面画图)。

  1. attr = []  
  2. v1 = []  
  3.     
  4. for class2 in sortedDict:  
  5.     # print(class2[0]+str(class2[1]))  
  6.     if class2[0] in dict:  
  7.         attr.append(dict[class2[0]])  
  8.         v1.append(class2[1])  
  9.     
  10. print(attr)  
  11. print(v1)  

        结果如下(部分):

 

四、数据可视化

    这里我用到了第三方库pyecharts,这个库是一个生成Echarts图表的python类库,功能强大,图表也美观。利用该库画图除了可参考官方文档之外,还可参考这篇——各种图表的详细代码

  1. bar = Bar("条形图","各类别图书的教师借阅次数",width=1400, height=700)  
  2. bar.add("借阅次数统计图",attr,v1,mark_point=["min""max"],is_label_show=True,xaxis_interval=0,xaxis_rotate=-30,is_more_utils=True)  
  3. bar.render()  

    第二、三个参数为坐标轴的值。运行后在源码所在目录生成一个网页,里面就是动态的可视化图表。

 

目录
相关文章
|
23天前
|
数据采集 SQL 分布式计算
在数据清洗过程中,处理大量重复数据通常涉及以下步骤
【4月更文挑战第2天】在数据清洗过程中,处理大量重复数据通常涉及以下步骤
13 2
|
22天前
|
数据采集 数据挖掘 数据处理
数据清洗的主要步骤包括**理解数据、处理重复值、处理空缺值、处理异常值、数据标准化和数据收集
【4月更文挑战第3天】数据清洗的主要步骤包括**理解数据、处理重复值、处理空缺值、处理异常值、数据标准化和数据收集
21 2
|
数据采集 机器学习/深度学习 算法
②数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
587 0
②数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
|
9月前
|
PHP
php清洗数据实战案例(4):按照关联数组相同值名称进行筛选后对不同的指标予以合并计算的解决方案
php清洗数据实战案例(4):按照关联数组相同值名称进行筛选后对不同的指标予以合并计算的解决方案
39 0
“关联表单”组件文本数据筛选只支持包含条件的解决方案
在“关联表单”中使用数据筛选功能筛选文本时条件只有”包含“,此文章通过增加一个”下拉单选“组件,变相解决这个问题。
151 0
|
数据采集 SQL 分布式计算
数据预处理-数据清洗-读取过滤规则到程序代码|学习笔记
快速学习数据预处理-数据清洗-读取过滤规则到程序代码
149 0
数据预处理-数据清洗-读取过滤规则到程序代码|学习笔记
|
SQL 数据采集 NoSQL
数据预处理-航线类型操作类型-读取规则到程序|学习笔记
快速学习数据预处理-航线类型操作类型-读取规则到程序
271 0
数据预处理-航线类型操作类型-读取规则到程序|学习笔记
|
消息中间件 数据采集 分布式计算
数据预处理-数据推送-过滤纯查询数据|学习笔记
快速学习数据预处理-数据推送-过滤纯查询数据
94 0
数据预处理-数据推送-过滤纯查询数据|学习笔记
|
数据采集 自然语言处理 算法
①数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
282 0
①数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
|
SQL Oracle 关系型数据库
ETL(九):同构关联(源限定符转换组件的使用)(一)
ETL(九):同构关联(源限定符转换组件的使用)(一)
ETL(九):同构关联(源限定符转换组件的使用)(一)