數據清洗的概念:
# 數據分析的過程和別的過程沒什么區別 只要明確思路 其他都不難 拿做菜舉例
# 類比定義
數據分析過程 做菜過程
明確需求 明確做什么菜品
收集采集 去菜市場買菜
數據清洗 洗菜切菜配菜
數據分析 炒菜
數據報告 + 數據可視化 拍照發朋友圈吃
# 專業定義
數據清洗是從記錄表、表格、數據庫中檢測、糾正或刪除損壞或不准確記錄的過程
# 專業名詞
1.臟數據
沒有經過處理 自身含有一定問題的數據(缺失、異常、重復...)
2.干凈數據
經過處理完全符合規范要求的數據
# 常用方法
1.讀取外部數據
1 # 讀取不同文件格式命令 2 read_csv 3 read_excel 4 read_sql 5 read_html
2.數據概覽
1 # 2 index 3 columns 4 head 5 tail 6 shape 7 describe 8 info 9 dtypes
3.簡單處理
移除首尾空格 大小寫轉換...
4.重復值處理
duplicated() 查看是否含有重復數據
drop_duplicates() 刪除重復數據
5.缺失值處理
刪除缺失值、填充缺失值
6.異常值處理
刪除異常值、修正異常值(當做缺失值處理)
7.字符串處理
切割、篩選...
8.時間格式處理
Y m d H M S
"""以上步驟三到步驟八沒有固定順序"""
數據清洗實戰案例:
1 # 先是導入數據分析三劍客模塊 2 import numpy as np 3 import pandas as pd 4 import matplotlib.pyplot as plt
# 選擇需要進行數據分析的軟件 df = pd.read_csv(r'qunar_freetrip.csv')
# 隨后便是查看其數據 進行分析
1 # 查看前五條數據 掌握大概 2 df.head() 3 # 查看表的行列總數 4 df.shape 5 # 查看所有的列字段 6 df.columns # 發現列字段有一些是有空格的 7 # 查看數據整體信息 8 df.info() # 發現去程時間和回程時間是字符串類型需要做日期類型轉換 9 # 快速統計 10 df.describe()

列字段處理:
1 # 1.刪除無用列字段 2 # df.drop(columns='Unnamed: 0',axis=1,inplace=True) 3 # 2.獲取列字段 4 cols = df.columns.values 5 # 3.for循環依次取出列字段首位的空格 6 7 # 方式1 比較繁瑣 8 # ccs = [] 9 # for col in cols: 10 # ccs.append(col.strip()) 11 # print(ccs) 12 13 # 方式2 列表生成式 14 df.columns = [col.strip() for col in cols] 15 df.columns
重復值處理:
# 4.重復數據查找 # df.duplicated() # 5.簡單的樓一眼重復數據的模樣(布爾值索引) 可以省略 # df[df.duplicated()] # 6.針對重復的數據 一般情況下都是直接刪除的 # df.drop_duplicates(inplace=True) # 7.確認是否刪除 # df.shape # 8.行索引會不會因為數據的刪除而自動重置(刪除完數據之后行索引是不會自動重置的) ## 如何獲取表的行索引值 # 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方法 ################################ # 針對缺失值的處理 # 1.采用數學公式依據其他數據填充 # 2.缺失值可能在其他單元格中含有 # 3.如果缺失值數量展示很小可刪除
目的地缺失值處理:
# 針對目的地操作如上(篩選要比出發地難!!!) # 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]
添加新列表:
# 酒店類型
# 將酒店變為列表 [re.findall(' (.*?) ',i) for i in df['酒店'].values] # 加入新列表 df['酒店類型']=[re.findall(' (.*?) ',i) for i in df['酒店'].values] df
# 酒店評分
同上篩選出即可 另一種方法為 df.insert(6,'酒店評分',[re.findall(' (\d.\d)分',i) for i in df['酒店'].values]) df
# 游玩時間
# 同上 [re.findall('\d天\d晚',i) for i in df['路線名'].values] df.insert(4,'游玩時間',[re.findall('\d天\d晚',i) for i in df['路線名'].values]) df
補充:
"""MySQL中如何快速判斷某列是否還有重復數據"""
# 思路:統計某個字段選數據的個數 在利用去重操作 兩者結合判斷
# 先統計數據個數(重復也會統計進去) select count(name) from userinfo; # 利用去重操作 先去重再計數 select count(distinct(name)) from userinfo;
# 如果兩者數字相同表示name列沒有重復的數據 不同則表示含有重復的數據