Numpy
1、Numpy的属性
array是一个Numpy可以识别的矩阵
创建方式:
import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
若是访问a的属性
>>> a.ndim #访问a的维度
2
>>> a.shape #获取a的形状
(2, 3)
>>> a.size #获取矩阵a中的元素总数
6
2、Numpy创建array
1)用np.array()创建
import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
2)创建的时候有一个dtype
a = np.array([[1,2,3],[4,5,6]],dtype = np.float32)
>>> a
array([[1., 2., 3.],
[4., 5., 6.]], dtype=float32)
>>> a.dtype
dtype('float32')
3)特殊的生成方式
>>> b = np.zeros((3,2)) #生成形状为(3,2)的全部为0的矩阵
>>> b
array([[0., 0.],
[0., 0.],
[0., 0.]])
>>> c = np.ones((4,3)) #生成元素全部为1的形状为(4,3)的矩阵
>>> c
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
>>> c.dtype
dtype('float64') #这种方式创建的数组元素是float64的
>>> d = np.arange(0,10,2) #其中2是步长
>>> d
array([0, 2, 4, 6, 8])
>>> d.reshape((5,1)) #用reshape可以改变形状,但是元素个数应该满足条件
array([[0],
[2],
[4],
[6],
[8]])
>>> e = np.linspace(1,10,5)
>>> e
array([ 1. , 3.25, 5.5 , 7.75, 10. ])
3、numpy的基础运算
1)两个array 的加减乘除以及次方都是各个位置上的元素作相应的计算
2)
>>> a = 10*np.sin(np.arange(10)) #参数是一个array,把里面的每个元素都取正弦再乘以10
>>> a
array([ 0. , 8.41470985, 9.09297427, 1.41120008, -7.56802495,
-9.58924275, -2.79415498, 6.56986599, 9.89358247, 4.12118485])
>>> print(a<0) #在a中满足条件的对应位置输出True,否则为0
[False False False False True True True False False False]
3)若是要进行数学中的矩阵相乘运算
np.dot(a,b)或者用a.dot(b)
4)用np.random.random((shape))可以生成指定形状的随机矩阵
>>> a = np.random.random((4,2))
>>> a
array([[0.09803711, 0.69012699],
[0.93807771, 0.20197655],
[0.53858079, 0.36067966],
[0.56331237, 0.82411983]])
5)
>>> a = np.random.random((3,2))
>>> a
array([[0.73122454, 0.88231568],
[0.82252921, 0.81762152],
[0.86713797, 0.42036254]])
>>> a.sum()
4.541191466045384
>>> np.sum(a)
4.541191466045384
>>> a.max()
0.882315679709413
>>> np.max(a)
0.882315679709413
6)参数axis = 1的时候是横向操作,axis=0的时候是竖向操作
7)a.argmin/np.argmin(a) 求a最小值的索引
>>> a.argmin()
5
a.mean()或者np.mean(a)所有元素的求均值
>>> a.mean()
0.7568652443408973
np.median(a)求中位数
(重新创建了array)
>>> a = np.arange(12).reshape((3,4))
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.median(a)
5.5
np.cumsum(a)累加
>>> np.cumsum(a)
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66], dtype=int32)
>>> a.cumsum()
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66], dtype=int32)
np.diff(a)累差
>>> np.diff(a)
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
np.nonzore(a)输出不为0的位置
>>> np.nonzero(a)
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
np.sort(a)逐行进行排序
np.transpose(a)或者a.T 进行转置
np.clip(a,5,9)所有小于5 的数让他等于5,所有大于9的让他等于9
4、Numpy的索引
>>> A = np.arange(12).reshape((3,4))
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
1)跟列表访问方式相同(两种方式均可)
>>> A[1][2]
6
>>> A[1,2]
6
2)切片操作
>>> A[:,1]
array([1, 5, 9])
>>> A[1,:]
array([4, 5, 6, 7])
>>> A[1,0:2]
array([4, 5])
3)迭代
>>> for row in A:
... print(row)
...
[0 1 2 3]
[4 5 6 7]
[ 8 9 10 11]
默认是迭代行,若是迭代列,可以对矩阵进行转置
A.flat是产生一个迭代器,可以用for进行访问。若是要得到里面的元素组成的一维列表,可以用A.flatten()
>>> A.flatten()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
5、numpy的合并
>>> a = np.arange(12).reshape((2,6))
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> b = np.ones((2,6))
>>> b
array([[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
1)np.vstack((a,b))是把两个矩阵上下合并
>>> np.vstack((a,b))
array([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10., 11.],
[ 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1.]])
2)对于一个一维的序列
>>> c = np.arange(10)
>>> c
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
c.T并不能把它进行转置,要进行转置,可以进行下面的操作
>>> c[:,np.newaxis]
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
>>> c.reshape((10,1))
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
>>> c
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> c.shape
(10,)
np.concatenate合并可以选择维度
axis=0:
>>> np.concatenate((a,b),axis=0)
array([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10., 11.],
[ 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1.]])
>>> np.concatenate((a,b),axis=1)
array([[ 0., 1., 2., 3., 4., 5., 1., 1., 1., 1., 1., 1.],
[ 6., 7., 8., 9., 10., 11., 1., 1., 1., 1., 1., 1.]])
numpy的分割操作
1、
>>> A = np.arange(16).reshape(4,4)
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
axis = 1
>>> np.split(A,2,axis=1)
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
axis = 0
>>> c,d=np.split(A,2,axis=0)
>>> c
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> d
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
np.array_split()
>>> np.array_split(A,3,axis=1)
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2],
[ 6],
[10],
[14]]), array([[ 3],
[ 7],
[11],
[15]])]
np.vsplit&np.hsplit
>>> np.vsplit(A,2)
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
copy和deepcopy
numpy中若用array A的值给arrayB赋值,那么他们本质上是指向同一个地址的,对其中一个进行改变,另一个的值同样变化,这个和python的List是一样的。
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> B=A
>>> B
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> A[0][0]=11
>>> A
array([[11, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> B
array([[11, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
用B=A.copy进行deepcopy
>>> A
array([[11, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> B=A.copy()
>>> B
array([[11, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> A[0][0]=0
>>> B
array([[11, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
Pandas
1、基本介绍
pandas更像一个字典,可以给每一行或者每一列进行命名。
pandas创建一个序列
>>> a = pd.Series([1,2,3,np.nan,32,11])
>>> a
0 1.0
1 2.0
2 3.0
3 NaN
4 32.0
5 11.0
dtype: float64
最左边的一列是index
生成一个日期索引序列:
>>> dates=pd.date_range('20190101',periods=6)
>>> dates
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06'],
dtype='datetime64[ns]', freq='D')
生成一个DataFrame
>>> df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
>>> df
a b c d
2019-01-01 -0.757479 -1.275697 0.023078 -0.526511
2019-01-02 -0.701367 1.765137 -0.774334 0.748952
2019-01-03 -0.895433 -0.476380 0.696927 -0.361880
2019-01-04 -0.169814 0.662464 -0.853243 0.154464
2019-01-05 1.064632 1.353264 -1.202664 1.464638
2019-01-06 1.261063 -1.605963 1.271087 -0.220592
>>> df.index
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06'],
dtype='datetime64[ns]', freq='D')
>>> df.columns
Index(['a', 'b', 'c', 'd'], dtype='object')
>>> df.values
array([[-0.75747905, -1.27569666, 0.02307821, -0.52651098],
[-0.70136708, 1.76513736, -0.7743341 , 0.74895185],
[-0.89543309, -0.47638017, 0.69692699, -0.36188032],
[-0.16981387, 0.66246374, -0.85324283, 0.15446419],
[ 1.06463247, 1.35326435, -1.20266372, 1.46463843],
[ 1.26106331, -1.60596311, 1.27108651, -0.22059187]])
>>> df.describe()
a b c d
count 6.000000 6.000000 6.000000 6.000000
mean -0.033066 0.070471 -0.139858 0.209845
std 0.960572 1.399254 0.975557 0.764536
min -0.895433 -1.605963 -1.202664 -0.526511
25% -0.743451 -1.075868 -0.833516 -0.326558
50% -0.435590 0.093042 -0.375628 -0.033064
75% 0.756021 1.180564 0.528465 0.600330
max 1.261063 1.765137 1.271087 1.464638
sort_values用法
DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)
参数说明
by 指定列名(axis=0或‘index’)或者索引值(axis=1或‘columns’)
axis 若axis = 0或’index’,则按照指定的列种的数据大小排序;若axis=1或‘columns’,则按照指定索引中的数据大小排序,默认axis=0;
ascending 是否按指定的列的数组升序排列
inplace 是否用排序后的数据替换原来的数据
na_position {‘first’,‘last’},设定缺失值的显示位置
依据col1进行排序
>>> df = pd.DataFrame({'col1':['a','b','c','b'],'col2':[2,3,6,5],'col3':[4,5,6,8]})
>>> df
col1 col2 col3
0 a 2 4
1 b 3 5
2 c 6 6
3 b 5 8
>>> df.sort_values(by='col1')
col1 col2 col3
0 a 2 4
1 b 3 5
3 b 5 8
2 c 6 6
逆排序
>>> df.sort_values(by='col1',ascending=False)
col1 col2 col3
2 c 6 6
1 b 3 5
3 b 5 8
0 a 2 4
sort_index排序
2、选择数据
>>> df
col1 col2 col3
0 a 2 4
1 b 3 5
2 c 6 6
3 b 5 8
1)列表访问
直接df[1]会报错
df[1:2]访问第二行则不会
可以通过列进行索引
>>> df['col1']
0 a
1 b
2 c
3 b
Name: col1, dtype: object
2)标签筛选
用a.loc[]进行索引,[]里面是index 或者 columns,可以像array那样进行索引,也可以进行切片。(对列进行的时候,应该用[:,columns])
>>> df.loc[0,'col1']
'a'
>>> df.loc[0,'col1':'col2']
col1 a
col2 2
Name: 0, dtype: object
3)按位置筛选
用df.iloc[]
>>> df.iloc[0:2]
col1 col2 col3
0 a 2 4
1 b 3 5
4)混合筛选(df.ix[])
>>> df.ix[0:2,'col1']
0 a
1 b
2 c
Name: col1, dtype: object
>>> df.ix[0:2]
col1 col2 col3
0 a 2 4
1 b 3 5
2 c 6 6
>>> df.ix[[0,1],['col1','col2']]
col1 col2
0 a 2
1 b 3
5)是或否的筛选
>>> df[df.col2>2]
col1 col2 col3
1 b 3 5
2 c 6 6
3 b 5 8
#这个则仅仅打印出的col1那一列
>>> df.col1[df.col2>3]
2 c
3 b
Name: col1, dtype: object
3、设置值
>>> df
col1 col2 col3
0 a 2 4
1 b 3 5
2 c 6 6
3 b 5 8
1)可以按照位置或者标签进行更改
>>> df.loc[0,'a']='e'
>>> df
col1 col2 col3 a
0 a 2 4 e
1 b 3 5 NaN
2 c 6 6 NaN
3 b 5 8 NaN
>>> df.loc[0,'col1']='f'
>>> df
col1 col2 col3 a
0 f 2 4 e
1 b 3 5 NaN
2 c 6 6 NaN
3 b 5 8 NaN
2)Df.dropna(axis = 0/1 ,how = ‘all/any’)
>>> df.dropna(axis=0,how='any')
col1 col2 col3 a
0 f 2 4 e
>>> df.dropna(axis=1,how='any')
col1 col2 col3
0 f 2 4
1 b 3 5
2 c 6 6
3 b 5 8
3)填充为NaN的值
>>> df.fillna(value=11)
col1 col2 col3 a
0 f 2 4 e
1 b 3 5 11
2 c 6 6 11
3 b 5 8 11
4)判断是不是为NaN
>>> df.isnull()
col1 col2 col3 a
0 False False False False
1 False False False True
2 False False False True
3 False False False True
判断哪些列缺失
>>> df.isnull().any()
col1 False
col2 False
col3 False
a True
dtype: bool
>>> df[df.isnull().values==True]
col1 col2 col3 a
1 b 3 5 NaN
2 c 6 6 NaN
3 b 5 8 NaN
4、pandas导入与导出
data = pd.read_csv(‘文件名’)
data.to_csv(‘文件名’)
5、合并 concat
>>> df1 = pd.DataFrame(np.zeros((3,4)),columns=['a','b','c','d'])
>>> df2 = pd.DataFrame(np.ones((3,4)),columns=['a','b','c','d'])
>>> df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
>>> df1
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
>>> df2
a b c d
0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
>>> df3
a b c d
0 2.0 2.0 2.0 2.0
1 2.0 2.0 2.0 2.0
2 2.0 2.0 2.0 2.0
concatenating
>>> res = pd.concat([df1,df2,df3],axis=0,ignore_index = True)
>>> res
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0
6 2.0 2.0 2.0 2.0
7 2.0 2.0 2.0 2.0
8 2.0 2.0 2.0 2.0
join,[‘inner’,‘outer’]
>>> df1
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
>>> df2
b c d e
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
默认情况下join的值为’outer’
>>> res = pd.concat([df1,df2])
>>> res
a b c d e
0 0.0 0.0 0.0 0.0 NaN
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
2 NaN 1.0 1.0 1.0 1.0
3 NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 1.0 1.0 1.0
也可以设置为’inner’
>>> res = pd.concat([df1,df2],ignore_index = True,join = 'inner')
>>> res
b c d
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
5 1.0 1.0 1.0
参数join_axes
>>> res = pd.concat([df1,df2],axis = 1,join_axes = [df1.index])
>>> res
a b c d b c d e
0 0.0 0.0 0.0 0.0 NaN NaN NaN NaN
1 0.0 0.0 0.0 0.0 NaN NaN NaN NaN
2 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
append增加数据,默认axis = 0,也可以向DataFrame中添加Series
>>> res = df1.append(df2,ignore_index = True)
>>> res
a b c d e
0 0.0 0.0 0.0 0.0 NaN
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
3 NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 1.0 1.0 1.0
5 NaN 1.0 1.0 1.0 1.0
6、merge合并
>>> left = pd.DataFrame({'key':['K0','K1','K2','K3'],'A':['A0','A1','A2','A3'],'B':['B0','B1','B2','B3']})
>>> right = pd.DataFrame({'key':['K0','K1','K2','K3'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3']})
>>> left
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3
>>> right
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
3 K3 C3 D3
用on基于’key’进行合并
用merge进行合并how默认是inner
>>> res = pd.merge(left,right,on = 'key')
>>> res
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
也可以针对两个key进行合并
参数indicator 默认是False 可以改为True或者indicator_column
用left_index = True来进行按行合并
用suffixes加后缀
>>> boys = pd.DataFrame({'k':['K0','K1','K2'],'age':[1,2,3]})
>>> girls = pd.DataFrame({'k':['K0','K0','K3'],'age':[4,5,6]})
>>> res = pd.merge(boys,girls,on = 'k',suffixes = ['_boys','_girls'],how = 'inner')
>>> res
k age_boys age_girls
0 K0 1 4
1 K0 1 5
>>> res = pd.merge(boys,girls,on = 'k',suffixes = ['_boys','_girls'],how = 'outer')
>>> res
k age_boys age_girls
0 K0 1.0 4.0
1 K0 1.0 5.0
2 K1 2.0 NaN
3 K2 3.0 NaN
4 K3 NaN 6.0
7、pandas 画图
需要导入import matplotlib.pyplot as plt
需要先plot 然后再show
#Series
>>> data = pd.Series(np.random.randn(1000),index = np.arange(1000))
>>> data = data.cumsum()
>>> data.plot()
>>> plt.show()
plot methods:
‘bar’ ,‘hist’, ‘box’,‘area’,‘scatter’,‘hexbin’,‘pie’