數據清洗與實戰案例


目錄

  • 數據清洗的概念
  • 數據清洗實戰案例

 

數據清洗的概念

類比定義

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

 專業定義

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

專業名詞

臟數據

沒有經過處理自身含有一定問題的數據

干凈數據

經過處理完全符合規范要求的數據

常用方法

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

 

 優化版:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM