目錄
- 數據清洗的概念
- 數據清洗實戰案例
數據清洗的概念
類比定義
數據分析過程 做菜過程 明確需求 >>> 明確做什么菜品 收集數據 >>> 去菜市場買菜 數據清洗 >>> 澤菜洗菜切菜 數據分析 >>> 炒菜 數據報告+數據可視化 >>> 拍照發朋友圈吃菜
專業定義
數據清洗是從記錄表、表格、數據庫中檢測、糾正或者刪除損壞或不准確記錄的過程
專業名詞
臟數據
沒有經過處理自身含有一定問題的數據
干凈數據
經過處理完全符合規范要求的數據
常用方法
1.讀取外部數據 read_csv/read_excel/read_sql/read html 2.數據概覽 index/columns/head/tail/shape/describe/info/dtypes 3.簡單處理 移除字段名首尾空格,大小寫轉換... 4.重復值處理 duplicated() # 查看是否含有重復數據 drop_deplicates() # 刪除重復數據 5.缺失值處理 刪除缺失值,填充缺失值 6.異常值處理 刪除異常值、修正異常值 7.字符串處理 切割、篩選... 8.時間格式處理 Y、m、d、H、M、S
數據清洗實戰案例
數據讀取
import numpy as np import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv(r'qunar_freetrip.csv')
思路
1.查看前五條數據,掌握個大概 2.查看表的行列總數 3.查看所有的列字段 # 發現列字段有一些是有空格的 4.查看數據整體信息 # 發現去程時間和回程時間是字符串類型需要做日期類型轉換 5.快速統計
列字段處理
1.刪除無用列字段
df.drop(columns='Unnamed:0',axis=1,inplace=True)
2.獲取列字段發現字段名內有空格
cols = df.columns.values
3.利用for循環依次取出列字段首尾空格
# 方法一 ccs = [] for col in cols: ccs.append(col.strip()) print(ccs)
# 方法二 利用列表生成式 df.columns = [col.strip() for col in cols]
重復值處理
1.重復數據查找
df.duplicated()
2.簡單看一下重復數據的模樣,通過布爾值索引
3.對於重復的數據,最常見的處理方式就是刪除
df.drop_duplicates(inplace=True) df.shape # 確認是否一刪除
4.刪除之后發現原數據的行索引不會自動重置
5.解決措施就是先獲取表的行索引值,在右側加上賦值符號就是修改行索引
df.index df.index = range(0,df.shape[0]) df.tail()
補充
"""MySQL中如何快速判斷某列是否含有重復的數據""" # 思路 就是統計某個字段下數據的個數載利用去重操作,兩者結合判斷 如果兩者數字相同表示name列沒有重復的數據,不同表示含有重復的數據
sql語句
select count(name) from userinfo; select count(distinct(name)) from userinfo;
異常值處理
1.可以先通過快速統計的方法篩選出可能有異常數據的字段
df.describe() # 發現價格小於節省,那么可能是價格或節省有問題
2.利用固定的算法公式去求證我們的猜想
# 判斷的標准 sd = (df['價格'] - df['價格'].mean()) / df['價格'].std() # 利用邏輯索引篩選數據 df[(sd > 3)|(sd < -3)]
# 別忘了要移除正負號
df[abs(sd) > 3] # abs就是絕對值的意思
3.同理也可以篩選出節省的異常數據項(不一定要使用)
# 另一種更快的篩選節省異常數據的方式
df[df['節省'] > df['價格']]
4.刪除價格和節省都有異常的數據
# 方式一 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 得出一個結果就刪一個
出發地缺失值處理
1.查找具有缺失值得字段列名稱
2.利用布爾值索引篩選出出發地有缺失的數據
3.獲取出發地缺失的數據的路線數據
4.利用字符串切割替換出發地缺失數據
for i in res['路線名'].values: print(i.split('-')[0])
5.形成列表生成式簡寫上面的操作
並利用isnull方法查看出發地字段內是否有缺失數據
df.loc[df.出發地.isnull(),'出發地'] = [i.split('-')[0] for i in df.loc[df.出發地.isnull(),'路線名'].values]
總結
# 針對缺失值的處理 1.采用數學公式依據其他數據填充 2.缺失值可能在其他單元格中含有 3.如果缺失值數量展示很小可刪除
目的地缺失值處理
1.利用布爾值索引篩選出出發地有缺失的數據
2.獲取目的地缺失的路線數據
3.利用正則篩選出目的地
# 案例演示 reg_exp = '-(.*?)\d' # res = re.findall(reg_exp,'深圳-秦皇島3天2晚 | 入住大連黃金山大酒店 + 南方航空/東海往返機票')
代碼
import re for i in df.loc[df.目的地.isnull(),'路線名'].values: print(re.findall('-(.*?)\d',i)[0])
4.形成列表生成式簡寫上面的操作
並利用isnull方法查看出發地字段內是否有缺失數據
df.loc[df.目的地.isnull(),'目的地'] = [re.findall('-(.*?)\d',i) for i in df.loc[df.目的地.isnull(),'路線名'].values] df[df['目的地'].isnull()]
價格與節省缺失值處理
1.篩選出所有價格缺失的數據
2.直接利用價格的均值填充缺失數據
df['價格'].mean() round(df['價格'].mean(),1) df['價格'].fillna(round(df['價格'].mean(),1),inplace=True)
3.同理針對節省的數據也做中位數填充
df['節省'].fillna(round(df['節省'].mean(),1),inplace=True) # 驗證 df.isnull().sum()
作業:
新增三個列,分別是酒店類型、酒店評分、游玩時間
# 定義一個空列表 hotel_type=[] # fpr循環 for i in df['酒店'].values: hotel_type.append(re.findall(' (.*?) ',i)) # 賦值 df['酒店類型'] = np.array(hotel_type) hotel_rating = [] for i in df['酒店'].values: # 正則方法 hotel_rating.append(re.findall('(\d.\d)分',i)) df['酒店評分'] = np.array(hotel_rating) play_time = [] for i in df['路線名'].values: play_time.append(re.findall('(\d.\d晚)',i)) df['游玩時間'] = np.array(play_time) df
優化版: