數據清洗


數據清洗的概念

專業定義

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

 

專業名詞

臟數據

沒有經過處理自身含有一定問題的數據(缺失、異常、重復......)

 

干凈數據

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

 

 

常用方法

1.讀取外部數據

read_csv
read_excel
read_sql
read_html

  

2.數據概覽

index、colums、head、tail、shape、describe、info、dtypes

  

3.簡單處理

移除首尾空格,大小寫轉換......

 

4.重復值處理

duplicated()  # 查看是否含有重復數據
drop_duplicates()  # 刪除重復數據

  

5.缺失值處理

刪除缺失值、填充缺失值

 

6.異常值處理

刪除異常值、修正異常值(當作缺失值處理)

 

7.字符串處理

切割、篩選......

 

8.時間格式處理

Y(年)  m(月)  d(日)  H(時)  M(分)  S(秒)

 

步驟3到8沒有固定的順序,只不過前期不熟練的情況下可以如此執行

 

數據概覽

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(r'qunar_freetrip.csv')
# 1.查看前五條數據 掌握大概
df.head()
# 2.查看表的行列總數
df.shape
# 3.查看所有的列字段
df.columns  # 發現列字段有一些是有空格的
# 4.查看數據整體信息
df.info()  # 發現去程時間和回程時間是字符串類型需要做日期類型轉換
# 5.快速統計
df.describe()

df.columns

  

 

列字段處理

刪除無用字段

df.drop(columns='Unnamed: 0',axis=1,inplace=True)

  

獲取列字段

col = df.columns.values

  

 

for循環依次取出列字段首位的空格

方式1

ccs = []
for col in cols:
    ccs.append(col.strip())
print(ccs)

  

 

方式2:列表生成式

df.columns = [col.strip() for col in cols]

  

 

重復值處理

重復數據查找

df.dupliacted()

  

 

簡單看看重復數據的模樣(布爾值索引)

 

針對重復的數據一般都是直接刪除的

df.drop_dupliactes(inplace=True)

  

如何獲取表的行索引值

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方法

針對缺失值的處理

采用數學公式依據其他數據填充

缺失值可能在其他單元格中含有

如果缺失值數量展示很小可刪除

 

目的地的缺失值處理

# 針對目的地操作如下(篩選要比出發地難!!!)
# 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]

  

 

補充

MySQL中如何快速判斷某列是否含有重復的數據

思路

統計某個字段下的數據的個數,再利用去重操作,兩者結合判斷

select count(name) from userinfo;
select count(distinct(name)) from userinfo;

  

如果兩者數組相同表示name列沒有重復的數據,不同表示含有重復的數據。

 

小練習

給表多加幾列:酒店類型,評分游玩時間

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re

df = pd.read_csv(r'qunar_freetrip.csv')
cols = df.columns.values

an_list = []
res = df['酒店']
r = '(.*?)型'
for i in res:
    k = i.split(' ')[1]
    res2 = re.findall(r,k)
    if not res2:
        an1 = 'none'
    else:
        an1 = res2[0]
    an_list.append(an1)

r2 = '(.*?)分'
an_list2 = []
for i2 in res:
    k1 = i2.split('/')[0]
    res3 = k1.split(' ')[-1]
    an_list2.append(res3)

path_name = df['路線名']
time_cost = []
for i3 in path_name:
    k4 = i3.split('|')[0]
    k5 = k4.split('-')[1][-5:-1]
    time_cost.append(k5)

df['酒店類型'] = an_list
df['評分'] = an_list2
df['游玩時間'] = time_cost
df

  

 


免責聲明!

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



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