資料清洗與實戰案例
阿新 • • 發佈:2021-10-21
目錄
- 資料清洗的概念
- 資料清洗實戰案例
資料清洗的概念
類比定義
資料分析過程 做菜過程 明確需求 >>> 明確做什麼菜品 收集資料 >>> 去菜市場買菜 資料清洗 >>> 澤菜洗菜切菜 資料分析>>> 炒菜 資料報告+資料視覺化 >>> 拍照發朋友圈吃菜
專業定義
資料清洗是從記錄表、表格、資料庫中檢測、糾正或者刪除損壞或不準確記錄的過程
專業名詞
髒資料
沒有經過處理自身含有一定問題的資料
乾淨資料
經過處理完全符合規範要求的資料
常用方法
1.讀取外部資料 read_csv/read_excel/read_sql/read html 2.資料概覽 index/columns/head/tail/shape/describe/info/dtypes3.簡單處理 移除欄位名首尾空格,大小寫轉換... 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