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

一、文件导入

    1.1 源文件

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

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

    1.2 分类号-中文映射文件

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

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

    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)  

        结果如下(部分):

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

四、数据可视化

    这里我用到了第三方库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()  

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

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

12-08 11:35