Python小白入门的学习记录 6

127 阅读6分钟

机器学习库

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))) #二维数值 35列矩阵

所示结果:
[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])#获取下标58的元素

#直接赋值
arr4[5:8]=10#将下标58的元素赋值为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)   从04结束 步长为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