數據清洗的概念
專業定義
數據清洗是從記錄表、表格、數據庫中檢查、糾正或刪除損壞或不准確記錄的過程。
專業名詞
臟數據
沒有經過處理自身含有一定問題的數據(缺失、異常、重復......)
干凈數據
經過處理的完全符合規范要求的數據
常用方法
1.讀取外部數據
read_csv read_excel read_sql read_html
2.數據概覽
index、colums、head、tail、shape、describe、info、dtypes
3.簡單處理
移除首尾空格,大小寫轉換......
4.重復值處理
duplicated() # 查看是否含有重復數據 drop_duplicates() # 刪除重復數據
5.缺失值處理
刪除缺失值、填充缺失值
6.異常值處理
刪除異常值、修正異常值(當作缺失值處理)
7.字符串處理
切割、篩選......
8.時間格式處理
Y(年) m(月) d(日) H(時) M(分) S(秒)
步驟3到8沒有固定的順序,只不過前期不熟練的情況下可以如此執行
數據概覽
import numpy as np import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv(r'qunar_freetrip.csv') # 1.查看前五條數據 掌握大概 df.head() # 2.查看表的行列總數 df.shape # 3.查看所有的列字段 df.columns # 發現列字段有一些是有空格的 # 4.查看數據整體信息 df.info() # 發現去程時間和回程時間是字符串類型需要做日期類型轉換 # 5.快速統計 df.describe() df.columns
列字段處理
刪除無用字段
df.drop(columns='Unnamed: 0',axis=1,inplace=True)
獲取列字段
col = df.columns.values
for循環依次取出列字段首位的空格
方式1
ccs = [] for col in cols: ccs.append(col.strip()) print(ccs)
方式2:列表生成式
df.columns = [col.strip() for col in cols]
重復值處理
重復數據查找
df.dupliacted()
簡單看看重復數據的模樣(布爾值索引)
針對重復的數據一般都是直接刪除的
df.drop_dupliactes(inplace=True)
如何獲取表的行索引值
df.index
右側加上賦值符號就是修改行索引值
df.index = range(0,df.shape[0]) df.tail()
異常值處理
利用快速統計大致篩選出肯有異常數據的字段
df.describe() # 價格小於節省,那么可能是價格有問題或者節省有問題
利用公式求證猜想
sd = (df['價格'] - df['價格'].mean()) / df['價格'].std() # 判斷的標准 # 利用邏輯索引篩選數據 df[(sd > 3)|(sd < -3)] # 利用絕對值 df[abs(sd) > 3] # abs就是絕對值的意思(移除正負號)
同理驗證節省是否有異常
# 同理驗證節省是否有異常(不一定要使用) # sd1 = (df['節省'] - df['節省'].mean()) / df['節省'].std() # 判斷的標准 # 利用邏輯索引篩選數據 # df[(sd > 3)|(sd < -3)] # 利用絕對值 # df[abs(sd1) > 3] # abs就是絕對值的意思(移除正負號)
直接簡單粗暴找節省大於價格的數據
df[df['節省'] > df['價格']]
刪除價格和節省都有異常的數據
方式1:先拼接,再一次性刪除
# 橫向合並pd.merge() # 縱向合並pd.concat() # res = pd.concat([df[df['節省'] > df['價格']],df[abs(sd) > 3]]) ## 獲取要刪除的行數據 索引值 # del_index = res.index # 根據索引刪除數據 df.drop(index=del_index,inplace=True) # 再次重置索引 df.index = range(0,df.shape[0])
方式2: 得出一個結果就刪一個
出發地的缺失值處理
查找具有缺失值的列名稱
df.isnull().sum() # 統計每個字段缺失數據條數
利用布爾值索引篩選出出發地有缺失的數據
df[df.出發地.isnull()]
獲取出發地缺失的數據的路線數據
df.loc[df.出發地.isnull(),'路線名'].values
利用字符串切割替換出發地缺失數據
df.loc[df.出發地.isnull(),'出發地'] = [i.split('-')[0] for i in df.loc[df.出發地.isnull(),'路線名'].values]
操作數據的列字段需要使用loc方法
針對缺失值的處理
采用數學公式依據其他數據填充
缺失值可能在其他單元格中含有
如果缺失值數量展示很小可刪除
目的地的缺失值處理
# 針對目的地操作如下(篩選要比出發地難!!!) # df[df.目的地.isnull()] # 獲取目的地缺失的路線數據 # df.loc[df.目的地.isnull(),'路線名'].values # 利用正則篩選出目的地 import re # 案例演示 reg_exp = '-(.*?)\d' # res = re.findall(reg_exp,'深圳-秦皇島3天2晚 | 入住大連黃金山大酒店 + 南方航空/東海往返機票') df.loc[df.目的地.isnull(),'目的地'] = [re.findall(reg_exp,i) for i in df.loc[df.目的地.isnull(),'路線名'].values]
補充
MySQL中如何快速判斷某列是否含有重復的數據
思路
統計某個字段下的數據的個數,再利用去重操作,兩者結合判斷
select count(name) from userinfo; select count(distinct(name)) from userinfo;
如果兩者數組相同表示name列沒有重復的數據,不同表示含有重復的數據。
小練習
給表多加幾列:酒店類型,評分游玩時間
import numpy as np import pandas as pd import matplotlib.pyplot as plt import re df = pd.read_csv(r'qunar_freetrip.csv') cols = df.columns.values an_list = [] res = df['酒店'] r = '(.*?)型' for i in res: k = i.split(' ')[1] res2 = re.findall(r,k) if not res2: an1 = 'none' else: an1 = res2[0] an_list.append(an1) r2 = '(.*?)分' an_list2 = [] for i2 in res: k1 = i2.split('/')[0] res3 = k1.split(' ')[-1] an_list2.append(res3) path_name = df['路線名'] time_cost = [] for i3 in path_name: k4 = i3.split('|')[0] k5 = k4.split('-')[1][-5:-1] time_cost.append(k5) df['酒店類型'] = an_list df['評分'] = an_list2 df['游玩時間'] = time_cost df