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
。。。。。。