1. 程式人生 > >資料清洗(一):關聯資料的替換

資料清洗(一):關聯資料的替換

    有時我們的資料裡充滿了各種簡寫或標記,而在處理、展示資料的過程中,我們需要的是資料各欄位的詳細名稱,因此就需要對我們的資料集進行清洗與處理。前些天遇到一個某圖書館借閱資料,給出的要求是統計借閱圖書的類別,資料裡有每次借閱書籍的中圖分類號,如"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()  

    第二、三個引數為座標軸的值。執行後在原始碼所在目錄生成一個網頁,裡面就是動態的視覺化圖表。