Numpy & Pandas

Numpy&Pandas安装

1.pip 安装
如果可以访问外网的话一般推荐使用pip安装(pip安装真的超级方便~!!!),Linux和Windows下都可以使用这种方式安装。

python -m pip install --upgrade pip
pip install --user numpy pandas

但是很多时候会因为镜像以及一些其它的原因,采用上述方式安装特别慢,所以推荐采用来自豆瓣的源~

pip install numpy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install pandas -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

2.安装包安装
如果大家不能访问外网的话,可以去官网下载安装包,然后解压安装
pandas安装
numpy安装

Numpy & Pandas

简介

numpy和pandas都是python里面用于数据分析中非常重要的两个模块,他们两个模块本身是用c语言写出来的,pandas是基于numpy的一个模块。numpy是基于矩阵的运算。

numpy

import numpy as np 
array = ([[1,2,3],
		[2,3,4]]) #矩阵定义命名
print(array) #输出上面定义的矩阵
print(array.ndim) #输出上面定义的矩阵的维度=2
print(array.size) #输出上面定义的矩阵的大小nxm=6
print(array.shape) #输出上面定义的矩阵的行数和列数=(2,3)

numpy创建数组

import numpy as np

#创建一个数组用List的形式,并定义它的type为int
a = np.array([1,2,3],dtype = np.int) 

#输出这个数组,输出的数组没有逗号
print(a) 

#生成一个全0的3行4列的矩阵
b = np.zeros((3,4), dtype = np.int32)

#生成一个全1的3行4列的矩阵
c = np.ones((3,4),dtype = np.int32)

#生成一个3行4列什么都没有的矩阵,生成的矩阵的结果几乎每个元素都接近于0
d = np.empty(3,4)

#生成一个有序的数列/矩阵  10≤x<20,步长为2的数列
e = np.arange(10,20,2)

#生成一个从0到11的三行四列的矩阵
f = np.array(12).reshape((3,4))

#生成一个从1到10等差的20段的数列线段
g = np.linspace(1,10,20)

#更改上面生成的数列的形状,将上述生成的一维的数列更改为2行3列的数列
h = g.reshape((2,3))

numpy基础运算

1.数组运算

import numpy as np
a = np.array([10,20,30,40])
b = np.arange(4)

#减法
c = a-b
#加法
c = a+b
#平方
c = b**2
#求正弦函数,余弦、正切同理
c = 10*np.sin(a)

2.矩阵运算

import numpy as np
a = np.array([1,2,3],
			 [4,5,6])
b = np.arange(4).reshape(2,3)

#随机生成从0-1的2行4列的一个矩阵
d = np.random.randn(2,4)

#矩阵对应元素相乘得到新矩阵
c = a*b
#矩阵相乘,下面两种方式得到的结果都是相同的,都为矩阵a乘以矩阵b的值
c = np.dot(a,b)
c = a.dot(b)
#求矩阵中所有元素的和
e = np.sum(d)
#求矩阵中元素最小值
e = np.min(d)
#求矩阵每列的最小值axis = 0,求矩阵每行的最小值axis = 1
e = np.min(d,axis = 0)
#求矩阵中元素最大值
e = np.max(d)

3.基础运算(最大值最小值索引)

import numpy as np
a = np.arange(2,14).reshape(3,4)

#输出最小值所在的位置
print(np.argmin(a))   #最小值所在位置为第0位所以输出为0
#输出矩阵平均值
print(a.mean())
print(np.average(a))
#输出中位数
print(np.median(a))
#输出每次累加的结果,每加一个数就会输出一次输出的数字个数和矩阵中元素的个数相同
print(np.cumsum(a))
#输出每行相邻两个数的差,输出结果也为一个矩阵行数和原矩阵行数相同,列数为原列数减1
print(np.diff(a))
#输出两个array,第一个array是原矩阵的非0值的行数,第二个array代表原矩阵非0值的列数,每个对应起来。
print(np.nonzero(a))
#矩阵逐行从小到大排序
print(np.sort(a))
#矩阵转置(在矩阵的乘法运算当中用得比较多)
print(np.transpose(a))
print(a.T)
#将矩阵中所有小于3的数变成3,所有大于9的数变成9,中间的数保持不变
print(np.clip(a,3,9))

4.索引

import numpy as np

a = np.arange(3,15).reshape((3,4))
#输出a的第二行的值
print(a[2])
#输出第一行第一列的值
print(a[1][1])
print(a[1,1])
#输出第二行所有的数
print([2,:])
#输出第一列的所有的数
print([:,1])
#输出第一行第一列到第三列的数
print([1,1:3])

#输出每一行的数
for row in a:
	print(row)
#输出每一列的数(借用转置矩阵来实现)
for column in a.T:
	print(column)
#输出矩阵的每一项的值
for item in a.flat:
	print(item)

5.numpy array合并

import numpy as np
a = np.array([1,1,1])
b = np.array([2,2,2])

#vertical stack,序列上下合并[[1 1 1]
#						   [2 2 2]]
print(np.vstack((a,b))
#horizontal stack,序列左右合并[1 1 1 2 2 2]
print(np.hstack(a,b))
#输出纵向的矩阵(在行上增加一个维度)
print(a[np.newaxis,:])
print(a.reshape(3,1))

#进行多个序列的合并,axis = 0在行上进行合并,axis = 1在列上进行合并
c = np.concatenate((a,b,b,a),axis = 0)

6.numpy array 分割

import numpy as np

a = np.arange(12).reshape((3,4))

#横向分割,在列上进行分割,分割成两块(分割的块数必须为原列数的因子)
print(np.split(a,2,axis = 1))
#实现纵向不等量分割
print(np.array_split(a,3,axis = 1))
#实现纵向分割成三块,横向分割成两块 vertical split&horizontal split
print(np.vsplit(a,3))
print(np.hsplit(a,2))

7.numpy copy&deep copy

import numpy as np

a = np.arange(4)
b = a
c = a
d = b
a[0] = 11
"""
改变了a的第一个元素,那么b,c,d中的第一个元素都被改变了
即a,b,c,d都被关联起来了
"""
#deep copy
b = a.copy()
a[3] = 44
"""
这时候a和b没有被关联起来,此时改变a的值b的值不改变
"""

pandas

pandas基本介绍

如果numpy是一个列表,那么pandas则更像字典,可以在pandas中给与不同的行和不同的列的名字

import pandas as pd
import numpy as np
#创建一个pandas列表,nan代表什么都没有,为空
s = pd.Series([1,2,3,np.nan,44,1])
#定义并输出一个从2016-01-01到2016-01-06的序列,这里的dtype为一个日期的dtype,如dtype = 'datetime64[ns]'
dates = pd.data_range('20160101',periodes = 6)
print(dates)

#定义一个随机的6行4列的数据,行的名字为日期,列的名字为a,b,c,d
df = pd.DataFrame(np.random.randn(6,4),index = dates, columns = ['a','b','c','d'])
#用字典的方式定义dataframe
df = pd.DataFrame({'A':1.,
				   'B':pd.Timestamp('20181013'),
				   'C':pd.Series(1,index = list(range(4)),dtype = 'float32',
				   'D':np.array([3]*4,dtype = 'int32',
				   'E':pd.Categorical(["test","train","test","train",
				   'F':'foo'})
#输出df的dtype
print(df.dtypes)	
#输出每一行的值
print(df.values)	
#输出统计数据的功能,比如求平均值,数据的个数,最小值,最大值等。(会自动忽略非数字的属性)
print(df.describe())	   
#输出转置
print(df.T)
#倒序排序
print(df.sort_index(axis = 1, ascending = False)
#对第E列进行排序
print(df.sort_values(by='E'))

pandas基本用法

1.选择数据

import pandas as pd
import numpy as np

#创建一个以日期排序的随机数据
dates = pd.date_range('20181014',perioids = 6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index = dates,columns = ['A','B','C','D'])

#输出列名为A的一列数据,下面的方法功能相同
print(df['A'])
print(df.A)
#输出从第0-3行的数据
print(df[0:3])
#select by label:loc根据标签来选择数据
print(df.loc['20161015'])
print(df.loc[:,['A','B']])
#selct by position:iloc,输出第三行第一位的数据
print(df.iloc[3,1])
#mixed selection:ix(筛选第0-3行的AC两列)
print(df.ix[:3,;['A','C'])
#Boolean indexing输出在A列中值大于8的行和列
print(df[df.A>8])

2.pandas设置值

import pandas as pd
import numpy as np

#创建一个以日期排序的随机数据
dates = pd.date_range('20181014',perioids = 6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index = dates,columns = ['A','B','C','D'])

#将第二行第二列的值改为1111
df.iloc[2,2] = 1111
#将横向标签为20161015,纵向标签为B的值改为2222
df.loc['20161015','B'] = 2222
#将字典中的A列大于大于0的行的值全改为0
df[df.A>0] = 0
#将A列的大于0的值全部改为0
df.A[df.A>0] = 0
#将F列的值全部改为空
df['F'] = np.nan
#在后面增加一列E这列的值依次为1,2,3,4,5,6
df['E'] = pd.Series([1,2,3,4,5,6],index = pd.date_range('20161014',periods = 6))

3.处理丢失数据

import pandas as pd
import numpy as np

#创建一个以日期排序的随机数据
dates = pd.date_range('20181014',perioids = 6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index = dates,columns = ['A','B','C','D'])

#将在(0,1)和(1,2)位置的数据设置为丢失值
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan

#将存在有丢失值存在的那一行的数据全部丢掉axis=0为行,axis=1为列
print(df.dropna(axis = 0,how = 'any'))
#将一整行的数据都为NaN的时候才将哪一行的数据丢掉
print(df.dropna(axis = 1,how = 'all'))
#将NaN的数据填为0
print(df.fillna(value = 0))
#检查是否为缺失数据,如果是缺失数据那么会返回True,不是则返回False
print(df.isnull())
#档表格非常大的时候,输出True或者False就不是那么容易找出来了这时候采用下述方法,至少有一个丢失的时候就会返回True,要是没有返回False
print(no.any(df.isnull()) == True)

4.导入导出数据
在pandas中可以被读取的格式
read_csv
read_excel
read_hdf
read_sql
read_json
read_msgpack
(experimental)
read_html
read_gbq
(experimental)
read_stata
read_sas
read_clipboard
read_pickle

其中csv是最基础简单的数据格式


pandas中可以被保存的格式
to_csv
to_excel
to_hdf
to_sql
to_json
to_msgpack
(experimental)
to_html
to_gbq
(experimental)
to_stata
to_clipboard
to_pickle

与上面的read一一对应

import pandas as pd

#读取已有的student.csv文件
data = pd.read_csv('student.csv')
#存储为pickle文件类型
data.to_pickle('student.pickle')

5.pandas合并

import pandas as pd
import numpy as np

#concatenating
df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,columns = ['a','b','c','d'])

#上下合并,对行进行合并,ignore_index是将索引重新进行排序
res = pd.concat([df1,df2,df3],axis = 0,ignore_index = True
import pandas as pd
import numpy as np

#join,['inner','outer']
df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['b','c','d','e'],index = [2,3,4])
#将df中不同的部分填充为缺失值
res = pd.concat([df1,df2],join = 'outer'.ignore_index = True)
#将df中不同的部分裁剪掉,只保留相同的部分
res = pd.concat([df1,df2],join = 'inner',ignore_index = True)
import pandas as pd
import numpy as np

#join_axes
df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'],index = [1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['b','c','d','e'],index = [2,3,4])
#按照df1的索引进行合并,此时df2中没有的索引的行都变为缺失值
res = pd.concat([df1,df2],axis = 1,join_axes = [df1.index])
import pandas as pd
import numpy as np

#append
df1 = pd.DataFrame(np.ones((3,4))*0,columns = ['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns = ['b','c','d','e'])
s1 = pd.Series([1,2,3,4),index = ['a','b','c','d']]

#将df2和df1列不变合并
res = df1.append(df2,ignore_axes = True)
#在df上面添加Series
res = df1.append(s1,ignore_index = True)

6.pandas合并merge
merge可以用于实现关于索引的对照的合并

import pandas as pd

#merging two df by key/keys.(maybe used in database)
#simple example
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和right基于key关键词合并,合并完成之后只有一个key列
res = pd.merge(left,right,on='key')
import pandas as pd

#merging two df by key/keys.(maybe used in database)
#consider teo keys

left = pd.DataFrame({'key1':['K0','K0','K1','K2'],
					 'key2':['K0','K1','K0','K1'],
					 'A':['A0','A1','A2','A3'],
					 'B':['B0','B1','B2','B3']})
right = pd.DataFrame({'key1':['K0','K1','K1','K2'],
					 'key2':['K0','K0','K0','K0'],
					 'C':['C0','C1','C2','C3'],
					 'D':['D0','D1','D2','D3']})
#合并默认的方法为inner,how = ['left','right','outer','inner']
res = pd.merge(left,right,on=['key1','key2'],how = 'outer')
import pandas as pd

#merging two df by key/keys.(maybe used in database)
#indicator
df1 = pd.DataFrame({'col1':[0,1],'col_left':['a','b']})
df1 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})

res = pd.merge(df1,df2,on = 'col1',how = 'outer',indicator = True)
#give the indicator a custom name
res = pd.merge(df1,df2,on = 'col1',how = 'outer')
import pandas as pd

#merging two df by key/keys.(maybe used in database)
#merged by index
left = pd.DataFrame({'A':['A0','A1','A2'],
					 'B':['B0','B1','B2']},
					 index = ['K0','K1','K2'])
right = pd.DataFrame({'C':['C0','C1','C2'],
					  'D':['D0','D1','D2']},
					  index = ['K0','K2','K3'])
#left_index and rigth_index
res = pd.merge(left,right,left_index = True,right_index = True,how = 'outer')
res = pd.merge(left,right,left_index = True,right_index = True,how = 'inner')
import pandas as pd

#merging two df by key/keys.(maybe used in database)
#hadle overlapping
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 = ['_boy','_girl',how = 'inner'])

7.pandas plot 图表

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#plot data

#Series
data = pd.Series(np.random.randn(1000),index = np.arange(1000))
data = data.cumsum()
data.plot()
#定义x轴和y轴
plt.plot(x=a,y=b)
plt.show()

#Data Frame
data = pd.DataFrame(np.random.randn(1000,4),
					index = np.arange(1000),
					columns = list("ABCD"))
#数据累加
data = data.cumsum()
data.plot()
#plot method:'bar','box','kde','area','scatter','hexbin','pie'
#scatter一般只有两个属性,
ax = data.plot.scatter(x='A',y='B',color = 'DarkBlue',label = 'Class1')
#ax = ax表示在一张图上面打印两组的数据
data.plot.scatter(x='A',y='c',color = 'DarkGreen',label = 'Class2',ax = ax)
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值