Python數據分析:數據讀取、預處理
文章目錄
標準數據集
https://blog.csdn.net/csc_1/article/details/68070174
- 瑞典汽車保險數據集 https://www.math.muni.cz/~kolacek/docs/frvs/M7222/data/AutoInsurSweden.txt
- 墨爾本最低日常溫度 daily-minimum-temperatures.csv
該數據集描述了澳大利亞墨爾本市10年(1981-1990)的最低日常溫度。單位爲攝氏度,有3,650個觀測值。數據來源被稱爲澳大利亞氣象局。https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv - UCI 機器學習庫
http://mlr.cs.umass.edu/ml/
1. 數據讀入、保存
查詢當前的工作路徑
import os
os.getcwd() #獲取當前工作路徑
%pwd #獲取當前工作路徑
Excel 數據讀入
- 打開 Try JupyterLab / 上傳.csv文件 / 複製已有的Untitled.ipynb文件進行編輯
- 打開 Try Classic Notebook / File / Open /上傳.csv文件/ 編輯代碼然後運行
import pandas as pd #導入pandas包
data = pd.read_csv("myexcel.csv") # pd.read_csv讀取
#data = pd.read_excel("myexcel.xlsx") # pd.read_excel讀取
print(data)
數據保存
import pandas as pd #導入pandas包
data = pd.read_csv("myexcel.csv") # pd.read_csv讀取myexcel.csv
data.to_csv("myexcel2.csv") # 導出數據到CSV文件myexcel2.csv
數據複製 淺拷貝、深拷貝
copy.copy 是將父對象的值複製了一份,但是子對象指向同一內存地址
copy.deepcopy 將父子對象的值全部複製一份,和原對象已沒有任何關係
import copy
a = [1,2,3,4,['a','b']] #原始對象
b = a #賦值,傳對象的引用
c = copy.copy(a) #淺拷貝
d = copy.deepcopy(a) #深拷貝
a.append(5)
a[4].append('c')
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
------------------------------------------------------------
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c= [1, 2, 3, 4, ['a', 'b', 'c']]
d= [1, 2, 3, 4, ['a', 'b']]
讀入 .csv文件時的編碼問題 utf-8' codec can't decode
- 直接在讀取時聲明csv的編碼方式爲‘gbk’
data=pd.read_csv(‘data.csv’,encoding=‘gbk’) - 將數據源的編碼方式改爲‘utf-8’
找到csv文件–》右鍵–》打開方式–》記事本
打開記事本,“文件–》另存爲”,可以看到文件的默認編碼格式爲ANSI
選擇編碼下拉框,選擇需要的編碼格式UTF8,重新保存即可
2. 數據預處理
數據質量分析的任務是檢測原始數據中是否存在髒數據,髒數據一般是指不符合要求,不能直接進行相應分析的數據,髒數據一般包括:缺失值
、異常值(離羣點)
、不一致的值
、內容未知的值
。
缺失值的四種處理方法:刪除記錄
,數據填補
,和不處理
。
缺失值處理: 刪除缺失值所在行
#缺失值處理: 刪除缺失值所在行
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,5),columns = list('abcde'))
df.iloc[0,2] = np.nan #iloc是選擇行和列
df.loc[2] = np.nan #loc是選擇行
print(df)
nan_all=df.isnull() #找出缺失值
print(nan_all)
drop = df.dropna() #丟棄包含缺失值的行記錄
print(drop)
------------------------------------------------------------
a b c d e
0 0.563419 -0.058732 NaN -0.036233 -0.431621
1 -0.219255 0.767613 -0.683556 -2.222446 0.443755
2 NaN NaN NaN NaN NaN
a b c d e
0 False False True False False
1 False False False False False
2 True True True True True
a b c d e
1 -0.219255 0.767613 -0.683556 -2.222446 0.443755
重複值處理: 判斷並刪除重複值所在行
#重複值處理: 判斷並刪除重複值所在行
import pandas as pd
import numpy as np
data = pd.DataFrame([[1,2,3],['a','b','c'],[1,2,3]],columns=list('abc'))
print("原始數據:\n",data)
print(data.duplicated()) #判斷是否有重複行
data = data.drop_duplicates() #去掉重複行
print(data.shape) #查看數據的行列大小:(25375,8)
print("去重數據:\n",data)
------------------------------------------------------------
原始數據:
a b c
0 1 2 3
1 a b c
2 1 2 3
0 False
1 False
2 True
dtype: bool
(2, 3)
去重數據:
a b c
0 1 2 3
1 a b c
異常值的處理方法:統計法
、3σ 法
、箱型圖
異常值的測量標準有很多,比較常見的是描述性統計法
、3σ 法
、箱型圖
等
統計法
#異常值處理:描述性統計
import pandas as pd
import numpy as np
data = pd.read_csv('myexcel2.csv', header=0)
print(data.shape) #查看行列數
print(data.head(5)) #查看前5行數據
print(data.describe())
neg_list = ['數量','單價','總額']
#統計數據中每列小於0的數的個數
for item in neg_list:
neg_item = data[item]<0
print(item + '小於0的有' + str(neg_item.sum()) + '個')
#此處將小於0的數據刪除
yichangList = []
for item in neg_list:
for i in range(0, len(data)):
if data[item][i]<0:
yichangList.append(i)
yichangList = list(set(yichangList))
print(yichangList)
#打印刪除了小於0的數據
for yichangHang in yichangList:
data = data.drop(yichangHang)
print(data)
#再次統計數據中每列小於0的數的個數
for item in neg_list:
neg_item = data[item]<0
print(item + '小於0的有' + str(neg_item.sum()) + '個')
------------------------------------------------------------
(20, 5)
ID 名稱 數量 單價 總額
0 1 A 5 12 60
1 2 B 3 36 108
。。。。。。
ID 數量 單價 總額
count 20.00000 20.00000 20.000000 20.000000
mean 10.50000 3.45000 102.050000 223.400000
std 5.91608 3.88621 248.219868 439.866295
min 1.00000 -9.00000 1.000000 -25.000000
25% 5.75000 2.00000 22.750000 56.500000
50% 10.50000 3.00000 25.500000 112.500000
75% 15.25000 6.25000 30.750000 161.250000
max 20.00000 8.00000 1000.000000 2000.000000
數量小於0的有2個
單價小於0的有0個
總額小於0的有2個
[10, 3]
ID 名稱 數量 單價 總額
0 1 A 5 12 60
1 2 B 3 36 108
。。。。。。
數量小於0的有0個
單價小於0的有0個
總額小於0的有0個
3σ 法
當數據服從正態分佈時,99%的數值應該位於距離均值3個標準差之內的距離,P(|x−μ|>3σ)≤0.003,當數值超出這個距離,可以認爲它是異常值。
# 3σ 法則統計
import pandas as pd
import numpy as np
import copy
data = pd.read_csv('myexcel2.csv', header=0)
data_c = copy.deepcopy(data) #深拷貝數據
print(data.shape) #查看行列數
print(data.head(5)) #查看前5行數據
print(data.describe())
neg_list = ['數量','單價','總額']
#統計數據中每列不符合 3σ 法則的數的個數 P(|x−μ|>3σ)≤0.003
for item in neg_list:
data_c[item] = (data_c[item] - data_c[item].mean())/data_c[item].std()
z_abnormal = abs(data_c[item])>3
print(item + '中有' + str(z_abnormal.sum()) + '個異常值')
#此處將不符合 3σ 法則的數據刪除
yichangList = []
for item in neg_list:
data_c[item] = (data_c[item] - data_c[item].mean())/data_c[item].std()
for i in range(0, len(data_c)):
if abs(data_c[item][i])>3:
yichangList.append(i)
yichangList = list(set(yichangList))
print(yichangList)
#打印刪除了不符合 3σ 法則的數據
for yichangHang in yichangList:
data = data.drop(yichangHang)
print(data)
------------------------------------------------------------
(20, 5)
ID 名稱 數量 單價 總額
0 1 A 5 12 60
1 2 B 3 36 108
。。。。。。
ID 數量 單價 總額
count 20.00000 20.00000 20.000000 20.000000
mean 10.50000 3.45000 102.050000 223.400000
std 5.91608 3.88621 248.219868 439.866295
min 1.00000 -9.00000 1.000000 -25.000000
25% 5.75000 2.00000 22.750000 56.500000
50% 10.50000 3.00000 25.500000 112.500000
75% 15.25000 6.25000 30.750000 161.250000
max 20.00000 8.00000 1000.000000 2000.000000
數量中有1個異常值
單價中有1個異常值
總額中有1個異常值
[11, 3]
ID 名稱 數量 單價 總額
0 1 A 5 12 60
1 2 B 3 36 108
2 3 D 8 25 200
。。。。。。
箱型圖
#繪製箱型圖 展示異常值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('iris2.csv')
# column參數表示要繪製成箱形圖的數據,可以是一列或多列; by參數表示分組依據
data.boxplot(column=['s_l','s_w'],by='specs',grid=True,rot=25,fontsize=15)
# data.boxplot(grid=True) #全部列畫出
print(data.head())
plt.show()
#箱型圖 法則統計 並刪除異常值
import pandas as pd
import numpy as np
import copy
data = pd.read_csv('iris2.csv', header=0)
data_c = copy.deepcopy(data) #深拷貝數據
neg_list = ['s_l','s_w','p_l','p_w']
#箱型圖 IQR(差值)=U(上四分位數)-L(下四分位數) #上界=U+1.5IQR,下界=L-1.5IQR
for item in neg_list:
iqr = data_c[item].quantile(0.75) - data_c[item].quantile(0.25)
q_abnormal_L = data_c[item] < data_c[item].quantile(0.25)-1.5*iqr
q_abnormal_U = data_c[item] > data_c[item].quantile(0.75)+1.5*iqr
print(item+'中有'+str(q_abnormal_L.sum()+q_abnormal_U.sum())+'個異常值')
#此處將不符合 箱型圖 法則的數據刪除
yichangList = []
for item in neg_list:
iqr = data_c[item].quantile(0.75) - data_c[item].quantile(0.25)
q_L = data_c[item].quantile(0.25)-1.5*iqr
q_U = data_c[item].quantile(0.75)+1.5*iqr
for i in range(0, len(data)):
if data_c[item][i]<q_L or data_c[item][i]>q_U:
yichangList.append(i)
yichangList = list(set(yichangList))
print(yichangList)
#打印刪除了不符合 箱型圖 法則的數據
for yichangHang in yichangList:
data = data.drop(yichangHang)
print(data)
------------------------------------------------------------
s_l中有0個異常值
s_w中有4個異常值
p_l中有0個異常值
p_w中有0個異常值
[32, 33, 60, 15]
s_l s_w p_l p_w specs
。。。。。。
14 5.8 4.0 1.2 0.2 setosa
16 5.4 3.9 1.3 0.4 setosa
。。。。。。