全称Numerical Python,支持N维数组对象ndarray。
ndarray是用于存放同类型元素的多维数组;
ndarray中每个元素是数据类型对象的对象(成为dtype);
import numpy as np
#创建数组
a = [1,2,3,4]
b = np.array(a)
c = np.array([[1,2],[3,4]])
np.zeros(3) #全0一维数组
np.ones(3) #全1一维数组
np.zeros((3,3)) #全0二维数组,3行3列
np.ones((1,3)) #全1二维数组,1行3列
np.identity(3) #单位矩阵,3行3列
#随机数组
np.random.rand(10,10) #10行10列,每个数在0-1之间
np.random.uniform(0,100,5) #[0,100)内的5个数
np.random.randint(0,100) #[0,100)内的一个整数
np.random.normal(1.75,0.1,(2,3)) #生成2行3列的数组,均值1.75,标准差0.1的正态分布
#另外还有两种生成标准正态分布的函数:
np.random.randn(4,6) #4行6列
np.random.standard_normal(size=(4,6)) #参数必须是元组类型
#数组属性
x = np.array([[1,2,3],[4,5,6]])
print(x.size) #6
print(x.ndim) #2
print(x.shape) #(2,4)
print(x.itemsize) #4
print(x.dtype) #int32
y = x.reshape(3,2)
#数组乘法
x*y #点积(elementwise)
#索引和切片
#数组切片之后不会复制原数组,而所有操作都会视作在原数组上操作
arr = np.arange(10)
arr_slice = arr[5:8] #5,6,7
arr_slice[1] = 12345 #arr[6] = 12345
arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d[0] #array([[1,2,3],[4,5,6]]) 返回低一维的ndarray
arr3d[0][1] #array([4,5,6])
#数学和统计方法
arr = np.random.randn(5,4)
arr.mean(axis=0) #按列
arr.sum(axis=1) #按行
arr = np.array([[0,1,2],[3,4,5],[6,7,8]])
arr.cumsum(0) #[[0,1,2],[3,5,7],[9,12,15]]
arr.cumprod(1) #[[0,0,0],[3,12,60],[6,42,336]]
import numpy as np
import numpy.matlib
#生成矩阵
x = np.matrix([[1,2,3][4,5,6]])
x[0,0] #1
x[0][0] #[[1,2,3]]
print(np.matlib.empty((2,2))) #填充为随机数据
print(np.matlib.zeros((2,2))
print(np.matlib.ones((2,2))
print(np.matlib.eye(n=3,M=4,k=0,dtype=int))
#[[1,0,0,0]
# [0,1,0,0]
# [0,0,1,0]]
print(np.matlib.identity(4,dtype=int)) #4*4的单位阵
print(np.matlib.rand(4,4)) #4*4,数据在(0,1]
#矩阵与二维数组的转换
i = np.matrix('1,2;3,4')
j = np.asarray(i)
k = np.asmatrix(j)
#转置
i.T
#查看矩阵特征
x.mean(axis=None)
x.sum()
x.max()
x.argmax()
# 以上与ndarray类似
x.diagonal() #对角线元素
#矩阵乘法
x*y #这是矩阵乘法,不是点乘
#矩阵运算
np.dot(a,b) #一维点乘(elementwise),二维是矩阵乘积
np.vdot(a,b) #计算点积,会先把多为数组展开
np.linalg.inv(x) #对x求逆
np.linalg.solve(a,b) #求解线性方程组ax=b
np.linalg.det(x) #求x的行列式
np.linalg.eig(x) #求x的特征分解
np.linalg.svd(x) #求x的svd分解
快速便捷地处理数据
两大核心数据结构:Series(一维数据),DataFrame(多特征数据)
与Numpy中的一维数组array相似
import pandas as pd
import numpy as np
#Series的创建
#用Python数组创建
pd.Series([11,12],index=["BJ","SH"])
# BJ 11
# SH 12
#用numpy数组创建
pd.Series(np.arange(3,6)) #默认用0,1,2作为索引
# 0 3
# 1 4
# 2 5
#用字典创建
pd.Seris({
"BJ":11,"SH:"12,"SZ":14})
# BJ 11
# SH 12
# SZ 14
# 字典不允许索引重复,但Series允许
#Series的操作
obj = pd.Series([4,7,-5,3])
obj.values #array([4,7,-5,3])
obj[2] #-5
obj[[0,1,3]]
# 0 4
# 1 7
# 3 3
#重要功能:在算术运算中自动对齐不同索引的数据
obj2 = pd.Series({
"Ohio":35000,"Oregon":16000,"Texas":71000})
obj3 = pd.Series({
"California":np.nan,"Ohio":35000,"Oregon":16000})
obj2+obj3
# California NaN
# Ohio 70000
# Oregon 32000
# Texas 71000
表格型数据结构,每列可以使不同的值类型
可以看成是由Series组成的字典(共用同一个索引)
数据是以一个或多个二维块存放的
import pandas as pd
import numpy as np
#创建dataframe
df = pd.DataFrame() #empty dataframe
#从列表创建
data = [['Alex,10'],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
# Name Age
# 0 Alex 10.0
# 1 Bob 12.0
# 2 Clarke 13.0
#从字典创建 字典的key作为列索引,字典的值必须为等长列表
#dataframe操作
frame2['debt'] = 16.5 #debt一列全部赋值为16.5
frame2['debt'] = np.arange(5.) #debt一列赋值为0-4
#用已有列创建出一个新列
frame2['eastern'] = frame2.state == 'Ohio'
#删除一个列
del frame2['eastern']
#用嵌套字典生成
pop = {
'Nevada':{
2001:2.4,2002:2.9},'Ohio':{
2000:1.5,2001:1.7,2002:3.6}}
frame3 = pd.DataFrame(pop)
# Nevada Ohio
# 2000 NaN 1.5
# 2001 2.4 1.7
# 2002 2.9 3.6
frame3.T #转置
frame3.values
#array([[nan,1.5],[2.4,1.7],[2.9,3.6]],dtype=float)
frame2.values
#array([[2000,'Ohio',1.5,nan],...,[2002,'Nevada',2.9,-1.7],dtype=object)
import pandas as pd
import numpy as np
pd.read_xxx #读文件
pd.to_xxx #写文件
#e.g.
df = pd.read_csv("temp.csv")
#可指定csv文件中的一列来使用index_col指定索引
df = pd.read_csv("temp.csv",index_col=['S.No'])
#可改变某一列的数据类型
df = pd.read_csv("temp.csv",dtype={
'Salary': np.float64})
#可以更改列名
df = pd.read_csv("temp.csv",names=['a','b','c','d','e'],header=0) #将原来的列名改成a b c d e
#跳过指定行
df = pd.read_csv("temp.csv",skiprows=2) #跳过最前面两行
#描述性统计方法
df.sum() #相当于df.sum(axis=0),每列求和
#其他方法例如df.std(),df.mean()都默认对列操作
df.describe(include=['number']) #把值类型为数字的列汇总在一起,'object'可把字符串列汇总
#迭代与遍历
for col in df: #迭代列
print(col)
for key,value in df.iteritems(): #将每个列作为名称,将索引和值作为键和列值迭代为Series对象
print(key,value)
for row_index,row in df.iterrows(): #将索引作为名称,将该行的列和所对应的数据作为键值对迭代为Series对象
print(row_index,row)
for row in df.itertuples(): #每一行产生一个命名元组,元组的第一个元素是行的索引值,剩余的值是行值
print(row)
#排序
df.sort_index(ascending=True) #按索引排序
df.sort_values(by='B') #按B列的值进行排序
#缺失值标记
df.isnull()
df.notnull()
#缺失值处理
df.fillna(0) #用0填充所有NaN
df.fillna(method='pad') #向前填充(与它上方数据一致),同'fill'
df.fillna(method='backfill') #向后填充(与它下放数据一致),同'bfill'
#缺失值丢弃
df.dropna() #丢弃含NaN的行
df.dropna(axis=1) #丢弃含NaN的列
#替换通用数据
df.replace({
1000:10,2000:60}) #把df中的所有1000换成10,2000换成60