Python 第19課:數(shù)據(jù)清洗之去錯(cuò)、去空、去重
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站與策劃設(shè)計(jì),八公山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:八公山等地區(qū)。八公山做網(wǎng)站價(jià)格咨詢:13518219792
時(shí)間 2019-02-01?下午3:30
主講 劉培富
地點(diǎn) 四樓電教室
數(shù)據(jù)清洗是數(shù)據(jù)治理的關(guān)鍵環(huán)節(jié),是指對(duì)獲取的原始數(shù)據(jù)(也稱“臟數(shù)據(jù)”)進(jìn)行審查、校驗(yàn)、加工的過程,目的在于刪除重復(fù)信息、糾正錯(cuò)誤信息,保持?jǐn)?shù)據(jù)一致性。
一般來說,數(shù)據(jù)清洗,主要是對(duì)數(shù)據(jù)進(jìn)行去錯(cuò)、去空、去重處理。
針對(duì)一張包含姓名、身份證號(hào)碼、車牌號(hào)碼的數(shù)據(jù)表,建立糾錯(cuò)規(guī)則如下:
1.車牌號(hào)既不包含漢字贛,且不包含漢字饒。
2.身份證號(hào)碼的年份既不等于19也不等于20,身份證號(hào)碼的月份大于12,身份證號(hào)碼的日期大于31。
3.身份證號(hào)碼位數(shù)不等于18。
4.姓名的長(zhǎng)度小于等于1。
二、去空
對(duì)于關(guān)鍵性數(shù)據(jù),不允許為空,對(duì)于這類數(shù)據(jù),要查詢是否存在空值。
三、去重
在一張表中,有的數(shù)據(jù)列允許重復(fù),有的數(shù)據(jù)列則不允許重復(fù)。例如,對(duì)于一張車主信息表來說,姓名、身份證號(hào)可以重復(fù),因?yàn)榇嬖谝蝗说怯浂噍v車的情形,這種重復(fù),不能認(rèn)為是錯(cuò)誤。但是,車牌號(hào)則不允許重復(fù),否則就存在業(yè)務(wù)邏輯的錯(cuò)誤。所以,針對(duì)車牌號(hào)數(shù)據(jù)列,要進(jìn)行去重。
通過以下SQL語句,可以列出重復(fù)的數(shù)據(jù):
綜上,數(shù)據(jù)清洗,既要懂技術(shù),更要懂業(yè)務(wù),否則無法正確制定清洗規(guī)則,導(dǎo)致數(shù)據(jù)清洗流于形式,達(dá)不到清洗的效果。
最近學(xué)習(xí)python網(wǎng)絡(luò)數(shù)據(jù)獲取,看到了關(guān)于數(shù)據(jù)的清洗,覺得很好用,現(xiàn)貼出代碼,權(quán)當(dāng)記錄。
# Python 數(shù)據(jù)清洗
#cleanInput() 功能:
#輸入input,
#清除input中的'\n', 多余空格,文獻(xiàn)標(biāo)記[ ], 刪除單個(gè)字符(除i/a 外),轉(zhuǎn)化為utf-8編碼格式以消除轉(zhuǎn)義字符,
#輸出2-grams列表 ngrams
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import string
def cleanInput(input):
input = re.sub('\n'," ",input)
input = re.sub('
[0?9]?
',"",input)
input = re.sub(' +'," ",input)
input = bytes(input,'UTF-8')
input = input.decode("ascii", "ignore")
cleanInput = []
input = input.split(' ')
for item in input:
item = item.strip(string.punctuation) #刪除標(biāo)點(diǎn)符號(hào)
if len(item)1 or (item.lower() == 'a' or item.lower()=='i'):
cleanInput.append(item)
return cleanInput
def ngrams(input,n):
input = cleanInput(input)
output = []
for i in range(len(input)-n+1):
output.append(input[i:i+n])
return output
####################讀取數(shù)據(jù)======================================================
import pandas as pd
import numpy as np
d1 = pd.read_excel('C:\Users\xn084037\Desktop\清洗數(shù)據(jù)集.xlsx',sheetname='一級(jí)流量')
d1.head(2)
d2 = pd.read_excel('C:\Users\xn084037\Desktop\清洗數(shù)據(jù)集.xlsx',sheetname='二級(jí)流量')
d2.head(2)
d3 = pd.read_excel('C:\Users\xn084037\Desktop\清洗數(shù)據(jù)集.xlsx',sheetname='三級(jí)流量')
d3.head(2)
##########################清洗------01增——拓展數(shù)據(jù)維度
df_concat = pd.concat([d1,d2,d3])
df_concat
h1 = pd.DataFrame({'語文':[93,80,85,76,58],'數(shù)學(xué)':[87,99,95,85,70],'英語':[80,85,97,65,88]},
index =['韓梅梅','李雪','李華','王明','鐵蛋'])
h1
h2 = pd.DataFrame({'籃球':[93,80,85,76],'舞蹈':[87,99,95,85]},
index= ['李華','王明','鐵蛋','劉強(qiáng)'])
h2
pd.merge(left=h1,right=h2,left_index=True,right_index=True,how='inner')
df_concat.dropna()
df_concat.dropna(subset = ['客單價(jià)'])
repeat = pd.concat([df_concat,df_concat])
print('重復(fù)的數(shù)據(jù)集一共多少行:',len(repeat))
unique = repeat.drop_duplicates()
print('去重后的數(shù)據(jù)集一共多少行:',len(unique))
unique
df_concat.drop_duplicates(subset='流量級(jí)別')
df_concat.drop_duplicates(subset='流量級(jí)別',keep='last')
******************03 查——基于條件查詢*********************************
df_concat.loc[(df_concat['訪客數(shù)']10000)(df_concat['流量級(jí)別']=='一級(jí)'),:]
sort_df= df_concat.sort_values('支付金額',ascending=False)
sort_df
*********************04 分——分組和切分************************************
df_concat.groupby('流量級(jí)別')
df_concat.groupby('流量級(jí)別').sum()
df_concat.groupby('流量級(jí)別').sum()
df_concat.groupby('流量級(jí)別')['訪客數(shù)','支付金額'].sum()
df_concat.groupby('流量級(jí)別',as_index=False)['訪客數(shù)','支付金額'].sum()
pd.cut(x,bins,right,labels)
pd.cut(x=df_concat['訪客數(shù)'],bins=[0,100,1000,10000,100000])
df_concat['分類打標(biāo)']= pd.cut(x=df_concat['訪客數(shù)'],bins=[0,100,1000,10000,100000],
right=False,labels=['辣雞','百級(jí)','千級(jí)','萬級(jí)'])
df_concat
###################Pandas將多個(gè)Sheet寫入到本地同一Excel文件中
import pandas as pd #讀取兩個(gè)表格data1=pd.read_excel('文件路徑')
data2=pd.read_excel('C:\Users\xn084037\Desktop\副本三代核心系統(tǒng)入賬金額異常結(jié)果數(shù)據(jù).xlsx')#將兩個(gè)表格輸出到一個(gè)excel文件里面
data1=pd.read_excel('C:\Users\xn084037\Desktop\副本三代核心系統(tǒng)入賬金額.xlsx')#將兩個(gè)表格輸出到一個(gè)excel文件里面
writer=pd.ExcelWriter('D:新表.xlsx')
data1.to_excel(writer,sheet_name='sheet1')
data2.to_excel(writer,sheet_name='sheet2') #必須運(yùn)行
writer.save()#不然不能輸出到本地writer.save()