數據清洗
數據清洗概念:
數據分析過程:
明確需求>>>收集采集>>>數據清洗>>>數據分析>>>數據報告(數據可視化)
數據清洗專業定義:
數據清洗是從記錄表,表格,數據庫中檢測,糾正或刪除損壞或者不正確的記錄的過程
專業名詞解釋:
臟數據:沒有經過處理自身含有一定問題的數據(缺失,異常,重復)
干凈的數據:可以直接帶人模型的數據(或者是已經處理過的數據)
處理數據的常見方式:
1.讀取外部數據:
read_csv();read_excel();read_html();read_sql()
2.數據概覽:
data.index 概覽行索引
data.columns 查看有哪些列字段
data.head() 查看前五條數據
data.tail() 查看后五條數據
data.shape() 查看有幾行幾列
data.describe() 概覽數據
data.info() 查看表格數據
data.dtypes() 查看各個列字段的數據類型
3.簡單處理 (移除收尾空格,大小寫轉換)
4.重復值處理
duplicated()查看是否含有重復數據
當中的省略部分可以通過.sum()求和查看是否有重復值
通過drop_duplicates()刪除重復數據
5.缺失值的處理
fillna() 填充缺失值
dropna()刪除缺失值
isnull()/notnull() 查看是否有缺失值
6.異常值的處理
刪除異常值,修正異常值
7.字符串處理
切割,填充,篩選
8.時間格式處理
Y (year 年) m(month 月) d(day 日) H(hour 小時)M(minute 分)S(second 秒)
# 步驟三到步驟八沒有固定順序
實戰練習:
現有文件:
進行數據概覽
處理表格數據:
①刪除列字段:無用字段
data.drop(columns='Unnamed:0')
直接有結果顯示 需要加上參數 inplace=True 提交修改
②:去除列字段收尾的空格
data=pd.read_csv(r'qunar_freetrip.csv') res1=[] # 定義一個新列表 res=data.columns.values #獲取colums列字段的值 for i in res: # 將res的內容循環寫入i res1.append(i.strip()) # 寫入空列表 並通過.strip()移除首尾空格 data.columns=res1 data.columns
③:重復值處理:
先查看有無重復值
再刪除重復值:
刪除重復項后 出現index序號混亂的情況:
重置index即可
④異常值處理:
通過data.describe()查看數據概覽
發現消費金額小於打折金額 這是明顯不符合常理的
直接使用
df[df['節省'] > df['價格']]
來查看節省大於價格的字段
以及通過公式計算得出的一個數據
sd = (df['價格'] - df['價格'].mean()) / df['價格'].std()
df[(sd > 3)|(sd < -3)]
df[abs(sd) > 3]
拼接成一個大列表
最后刪除
最后再重置一下索引
⑤缺失值處理:
查看缺失值
查看出發地缺失值數據:
在通過路線名填充
獲取路線名的值
這里可以通過正則來獲取大連和濟南這兩個字段並且正則是保證不會錯的
將這兩段文字復制並賦值d1 和d2
首先需要導入模塊
import re
最后獲取到大連以及濟南
也可以通過字符串的切割獲取 比較簡單
df.loc[df.出發地.isnull(),'出發地'] = [i.split('-')[0] for i in df.loc[df.出發地.isnull(),'路線名'].values]
針對目的地的缺失值處理:
也是相同的步驟
re.findall('(.*?)\d',d3)
需要注意的是匹配到數字就停止 即\d就是
同樣寫入
df.loc[df.目的地.isnull(),'目的地'] = [re.findall(reg_exp,i) for i in df.loc[df.目的地.isnull(),'路線名'].values]
價格及節省的缺失值處理
這里可以直接使用平均數填充即可
計算這兩個數的均值
然后在進行填充
df['價格'].fillna(round(df['價格'].mean(),1),inplace=True) df['節省'].fillna(round(df['節省'].mean(),1),inplace=True) # round 1是指保留小數后一位
填充完畢后再次驗證
完成.
練習:
2.新增三個列
分別是酒店類型、酒店評分、游玩時間
import numpy as np import pandas as pd import matplotlib.pyplot as plt import re hotel_level=[] hotel=df['酒店'] #獲取酒店列字段所有數據 for i in hotel: #循環讀取這些數據 hotel_level.append(re.findall(' (.*?) ',i)) #通過正則匹配 以空格開始 空格結束 df['酒店類型']=hotel_level # 新增新列字段酒店類型 score=[] for a in hotel: score.append(re.findall('型(.*?)/',a)) df['酒店評分']=score time=[] plan=df['路線名'] for b in plan: b1=b.split('|')[0][-5:-1] time=b1 df['行程']=time df