机器学习库
numpy库
numpy数组与数据类型
用途:用于高性能科学计算和数据分析是常用的高级数据分析库的基础包
import numpy as np
arr1=np.array([2,3,4])#定义列表
print(arr1) #列表通过numpy封装
print(arr1.dtype)#类型
arr2=np.array([1.2,2.4,3.2])
print(arr2)
print(arr2.dtype)
print(arr1+arr2) #数据累加
print(arr2*10) #相乘
所示结果:
[2 3 4]
int32
[1.2 2.4 3.2]
float64
[3.2 5.4 7.2]
[12. 24. 32.]
numpy数组和标量的计算
data=[[1,2,3], [4,5,6]] #列表嵌套
arr3=np.array(data)
print(arr3)#转化为numpy二维矩阵
所示结果:
[[1 2 3]
[4 5 6]]
自定义
①数值为0(np.zeros)
print(np.zeros(10)) #自定数组 一维数组数值全为0
print(np.zeros((3,5))) #二维数值 3行5列矩阵
所示结果:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
tips:zeros支持union类型3,5应该用枚举包括起来 说实话这个没大懂
②数值为1(np.ones)
print(np.ones((2,3)))
所示结果:
[[1. 1. 1.]
[1. 1. 1.]]
③ 数值为空(np.empty)
print(np.empty((2,3,2)))#确保程序安全并不为全为空 会随机填入数值
所示结果:
[[[ nan 6.29209459e-309]
[1.13400704e-311 1.13400755e-311]
[0.00000000e+000 0.00000000e+000]]
[[0.00000000e+000 0.00000000e+000]
[0.00000000e+000 0.00000000e+000]
[0.00000000e+000 0.00000000e+000]]]
numpy数组的索引和切片
切片
arr4=np.arange(10) #产生0~9的整数
print(arr4[5])#获取第六个元素 下标从0开始算
print(arr4[5:8])#获取下标5到8的元素
#直接赋值
arr4[5:8]=10#将下标5到8的元素赋值为10
print(arr4)
#进行重新赋值但不改变原有内容
arr_slice=arr4[5:8].copy()
arr_slice[:]=15 #[:]指一个元素到最后一个元素都进行赋值
print(arr_slice)
print(arr4)
所示结果:
5
[5 6 7]
[ 0 1 2 3 4 10 10 10 8 9]
[15 15 15]
[ 0 1 2 3 4 10 10 10 8 9]
pandas库
用于数据的预处理和清洗
Series基本操作(一维数组)
①自动添加索引
from pandas import Series
import pandas as pd #功能在于以自定义的方式对齐显示
obj=Series([4,5,6,7])
print(obj) #自动添加索引 其索引可以重复 与字典不同 字典的值通过哈希运算
print(obj.index) #获取索引
print(obj.values)#获取数值
所示结果:
0 4
1 5
2 6
3 7
dtype: int64
RangeIndex(start=0, stop=4, step=1) 从0到4结束 步长为1
[4 5 6 7]
②手动添加索引index
obj2=Series([4,6,7,-1],index=['a','b','c','d'])
print(obj2)
所示结果:
a 4
b 6
c 7
d -1
③手动赋值
obj2=Series([4,6,7,-1],index=['a','b','c','d'])
obj2['c']=8
print(obj2)
所示结果:
a 4
b 6
c 8
d -1
④判断索引是否存在
obj2=Series([4,6,7,-1],index=['a','b','c','d'])
print('a'in obj2)
print('f'in obj2)
所示结果:
True
False
⑤字典转化为Series
dict={'beijing':35000,'shanghai':71000,'jingzhou':10000}
obj3=Series(dict)
print(obj3)
#更改索引
obj3.index={'bj','sh','jz'}
print(obj3)
所示结果:
beijing 35000
shanghai 71000
jingzhou 10000
sh 35000
bj 71000
jz 10000
字典的key值作为索引 value值作为Series数值
⑥重新索引(reindex)
obj4=Series([1,2,3,4],index=['d','c','b','a'])
obj5=obj4.reindex(['a','b','c','d','e'],fill_value=0) #放在列表中 多出来的索引值将自动为NaN
#fill_value=0 将多出来的索引值自动填充为0
print(obj5)
所示结果:
a 4
b 3
c 2
d 1
⑦自动填充
obj4 = Series([1, 2, 3, 4], index=['d', 'c', 'b', 'a'])
obj5 = obj4.reindex(['a', 'b', 'c', 'd','e']) # 放在列表中 多出来的索引值将自动为NaN
obj6=obj4.reindex(['a','b','c','d','e'],fill_value=0)# fill_value=0 将多出来的索引值自动填充为0
print(obj5)
print(obj6)
#相邻值填充
#原始数值
obj7=Series(['ww','ss','ff'],index=[0,2,4])
print(obj7.reindex(range(6)))
#变更后
print(obj7.reindex(range(6),method='ffill'))#ffill用上面的值进行填充 要用引号!
print(obj7.reindex(range(6),method='bfill'))#bfill用下面的值进行填充 要用引号
所示结果:
a 4.0 a 4
b 3.0 b 3
c 2.0 c 2
d 1.0 d 1
e NaN e 0
0 ww 0 ww 0 ww
1 NaN 1 ww 1 ss
2 ss 2 ss 2 ss
3 NaN 3 ss 3 ff
4 ff 4 ff 4 ff
5 NaN 5 ff 5 NaN
⑧删除缺失值(dropna)
from numpy import nan as NA #重命名
data=Series([1,NA,2])
print(data)
print(data.dropna()) #删除NA
所示结果:
0 1.0
1 NaN
2 2.0
dtype: float64
0 1.0
2 2.0
dtype: float64
Dataframe(多维数组)
①字典转化为DataFrame
data = {'city': ['shanghai', 'shanghai', 'shanghai','beijing', 'beijing'],
'year': [2016, 2017, 2018, 2017, 2018],
'pop': [1.5, 1.2, 3.6, 2.3, 2.5]} # 字典
frame=pd.DataFrame(data)
print(frame)
所示结果:
city year pop
0 shanghai 2016 1.5
1 shanghai 2017 1.2
2 shanghai 2018 3.6
3 beijing 2017 2.3
4 beijing 2018 2.5
横坐标为字典的key值,纵坐标为系统生成索引
②排序
frame2=DataFrame(data,columns=['year','city','pop'])#优先以年份到城市再到pop进行排序
print(frame2)
所示结果:
year city pop
0 2016 shanghai 1.5
1 2017 shanghai 1.2
2 2018 shanghai 3.6
3 2017 beijing 2.3
4 2018 beijing 2.5
③提取数据
print(frame2['year']) #第一种方式
print(frame2.city) #第二种方式
所示结果:
0 2016
1 2017
2 2018
3 2017
4 2018
Name: year, dtype: int64
0 shanghai
1 shanghai
2 shanghai
3 beijing
4 beijing
Name: city, dtype: object
④手动赋值(增加列)
frame2['new']=[100,200,300,100,200]
print(frame2)
所示结果:
year city pop new
0 2016 shanghai 1.5 100
1 2017 shanghai 1.2 200
2 2018 shanghai 3.6 300
3 2017 beijing 2.3 100
4 2018 beijing 2.5 200
⑤利用计算生成新列
frame2['TF']=frame2.city=='beijing'#判断城市是否为背景 True Flase
print(frame2)
所示结果:
year city pop TF
0 2016 shanghai 1.5 False
1 2017 shanghai 1.2 False
2 2018 shanghai 3.6 False
3 2017 beijing 2.3 True
4 2018 beijing 2.5 True
⑥利用字典嵌套生成新列
pop={'beijing':{2008:1.6,2009:2.6},
'shanghai':{2008:1.2,2009:2.8}
}
frame3=DataFrame(pop)
print(frame3)
所示结果:
beijing shanghai
2008 1.6 1.2
2009 2.6 2.8
⑦行列互换
print(frame.T)
所示结果:
0 1 2 3 4
city shanghai shanghai shanghai beijing beijing
year 2016 2017 2018 2017 2018
pop 1.5 1.2 3.6 2.3 2.5
⑧删除缺失值(dropna)
data2=DataFrame([[1,2,3],[4,NA,NA],[NA,7,NA]])
print(data2.dropna()) #出现NA的序列都被删除 整行删除
print(data2.dropna(how='all'))#保留不全为NA序列的数值
data2[4]=NA
print(data2)
print(data2.dropna(axis=1,how='all')) #整列删除 删除第四列
#填充赋值0
data2.fillna(0)
print(data2.fillna(0,inplace=True))#inpalce=True 对NA直接进行修改
print(data2)
所示结果:
0 1 2
0 1.0 2.0 3.0
0 1 2
0 1.0 2.0 3.0
1 4.0 NaN NaN
2 NaN 7.0 NaN
0 1 2 4
0 1.0 2.0 3.0 NaN
1 4.0 NaN NaN NaN
2 NaN 7.0 NaN NaN
0 1 2
0 1.0 2.0 3.0
1 4.0 NaN NaN
2 NaN 7.0 NaN
0 1 2 4
0 1.0 2.0 3.0 0.0
1 4.0 0.0 0.0 0.0
2 0.0 7.0 0.0 0.0
层次化索引
data3 = Series(np.random.randn(10), #随机取值
index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],
[1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
print(data3)
print(data3['b']) #取出b索引对应的数值
print(data3['b':'c'])#取出b和c的取值
print(data3.unstack())#转化为DataFrame
print(data3.unstack().stack())#从DataFrame转化回Series
所示结果:
a 1 -0.561821
2 -0.503577
3 1.139787
b 1 -1.101594
2 -0.038748
3 -1.099609
c 1 -0.352582
2 0.245496
d 2 -0.603262
3 -0.297976
dtype: float64
1 -1.101594
2 -0.038748
3 -1.099609
dtype: float64
b 1 -1.101594
2 -0.038748
3 -1.099609
c 1 -0.352582
2 0.245496
dtype: float64
1 2 3
a 0.320075 1.001845 -1.748063
b 0.085760 1.357548 -1.540524
c -1.091985 1.216548 NaN
d NaN 0.773021 -2.247038