數據清洗的概念及實戰案例(配圖)!!!


數據清洗的概念:

# 數據分析的過程和別的過程沒什么區別 只要明確思路 其他都不難 拿做菜舉例

# 類比定義

數據分析過程                做菜過程

  明確需求                  明確做什么菜品

  收集采集                  去菜市場買菜

  數據清洗                  洗菜切菜配菜

  數據分析                  炒菜

  數據報告 + 數據可視化            拍照發朋友圈吃

 

# 專業定義

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

 

# 專業名詞

  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列沒有重復的數據 不同則表示含有重復的數據


免責聲明!

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



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