1. 程式人生 > 其它 >資料清洗與實戰案例

資料清洗與實戰案例

目錄

  • 資料清洗的概念
  • 資料清洗實戰案例

資料清洗的概念

類比定義

 資料分析過程                                                  做菜過程
    明確需求              >>>                                 明確做什麼菜品
    收集資料              >>>                                 去菜市場買菜
    資料清洗              >>>                                 澤菜洗菜切菜
    資料分析              
>>> 炒菜 資料報告+資料視覺化 >>> 拍照發朋友圈吃菜

專業定義

資料清洗是從記錄表、表格、資料庫中檢測、糾正或者刪除損壞或不準確記錄的過程

專業名詞

髒資料

沒有經過處理自身含有一定問題的資料

乾淨資料

經過處理完全符合規範要求的資料

常用方法

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