資料清洗(一):關聯資料的替換
有時我們的資料裡充滿了各種簡寫或標記,而在處理、展示資料的過程中,我們需要的是資料各欄位的詳細名稱,因此就需要對我們的資料集進行清洗與處理。前些天遇到一個某圖書館借閱資料,給出的要求是統計借閱圖書的類別,資料裡有每次借閱書籍的中圖分類號,如"A122",'A'表示馬列毛鄧,'A1'表示馬克思恩格斯著作,'A12'表示單行著作,'A122'表示1848~1863年間。每一本書都有一個獨立的分類號,按照需求只需要對分類號的第一個字母,也即分類號一級索引進行統計,並將統計結果裡的字母用中文替換。因此這是一個入門級別的小任務,用Python就可以輕易的實現。
一、檔案匯入
1.1 原始檔
原始檔是一個80萬行的Excel(囧),索引號在某一列下,我需要處理的資料大概有四萬行。將其匯入至sourceData.csv檔案,便於讀取,資料格式如下圖。
1.2 分類號-中文對映檔案
在百度上查詢得到各分類號與中文名稱之間的對應關係,存放在'中圖分類法.txt'檔案中。
1.3 原始碼
- with open('中圖分類法.txt', 'r',encoding='GBK', errors='ignore') as f:
- bookFile = f.readlines()
-
# print(bookFile)
- with open('sourceData.csv', 'r',encoding='GBK', errors='ignore') as f:
- dataFile = f.readlines()
- # print(dataFile)
二、詞頻統計
2.1 提取一級索引號
我們按行讀取的資料形如"I267/121",而我們只需要最開始的字母,因此提取每行第一個元素即可。統計詞頻我們可以宣告一個字典變數,將每一個一級索引作為一個key,如果字典裡有該key,則值+1,否則建立key.
- newdict = {}
- for line in dataFile:
- # print(line[0])
- if line[0] in newdict:
- newdict[line[0]] += 1
- else:
- newdict[line[0]] = 1
2.2 字典排序
為了後面能直觀地看出各類別圖書借閱數量的異同,我們在此將該字典按照值的大小降序排列。在此需要用上sorted(dic,value,reverse)函式。由於sorted函式並不改變原字典,所以需要接受該函式的返回值——排列後的列表。
- sortedDict = sorted(newdict.items(),key = lambda x:x[1],reverse = True)
三、對映關係的替換
3.1 分類號資料字典化
由於分類號及其對應關係的資料為一行以逗號','隔開的文字,所以需要將其轉換成字典。該資料行形如'A,馬列毛鄧',結尾還有一個換行符,為了將其變為字典,就需要在剔除換行符的情況下以逗號將其分隔為兩個字串。
- dict = {}
- for line in bookFile:
- #print(line.strip().split(','))
- dict[line.strip().split(',')[0]] = line.strip().split(',')[1]
- print(dict)
3.2 字元與文字的對映
所以我們現在有兩個變數,一個是儲存了分類號與其對應中文的字典:{'A': '馬列毛鄧', 'B': '哲學宗教'...},一個是排序好的列表,列表元素為索引號及出現次數。我們現在需要將索引號替換為字典中對應索引號的值,將結果用兩個變量表示(方便後面畫圖)。
- attr = []
- v1 = []
- for class2 in sortedDict:
- # print(class2[0]+str(class2[1]))
- if class2[0] in dict:
- attr.append(dict[class2[0]])
- v1.append(class2[1])
- print(attr)
- print(v1)
結果如下(部分):
四、資料視覺化
這裡我用到了第三方庫pyecharts,這個庫是一個生成Echarts圖表的python類庫,功能強大,圖表也美觀。利用該庫畫圖除了可參考官方文件之外,還可參考這篇——各種圖表的詳細程式碼。
- bar = Bar("條形圖","各類別圖書的教師借閱次數",width=1400, height=700)
- bar.add("借閱次數統計圖",attr,v1,mark_point=["min", "max"],is_label_show=True,xaxis_interval=0,xaxis_rotate=-30,is_more_utils=True)
- bar.render()
第二、三個引數為座標軸的值。執行後在原始碼所在目錄生成一個網頁,裡面就是動態的視覺化圖表。