Numpy库与Pandas库基础

文章目录

    • Numpy
      • 数组操作
      • 矩阵操作
    • Pandas
      • Series
      • DataFrame
      • 常用方法

Numpy

全称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分解

Pandas

快速便捷地处理数据
两大核心数据结构:Series(一维数据),DataFrame(多特征数据)

Series

与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

DataFrame

表格型数据结构,每列可以使不同的值类型
可以看成是由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

你可能感兴趣的:(Python,python,numpy,数据结构,数据分析)