美文网首页
Numpy和Pandas基本操作速查

Numpy和Pandas基本操作速查

作者: 山岳之心 | 来源:发表于2021-02-25 23:02 被阅读0次

"""

numpy 基本操作

"""
'''
安装 Numpy 的方法:pip install numpy
'''
'''
ndarray 的基本属性
T : transpose
size 元素个数
ndim 数组的阶
shape 数组的维度 比如n行m列的数组维度就是(n,m)
Flat 返回数组的一维迭代器,就是将数组展平成一维列表
imag 返回数组的虚部
real 返回数组的实部
'''
'''
例1:利用random模块构建数组
'''

import numpy as np
a = np.random.random([4,4])
print(type(a))
print(a.shape)
print(a)

'''
例2:利用list,tuple,生成ndarray
'''

a = np.array([[1,2,3],[4,5,6],[7,8]])
print(a)

'''
例3:使用arrange生成步长不同的的迭代对象
'''

a = np.arange(12)
print(a)
a2 = np.arange(1,2,0.01)
print(a2)

'''
linspace 生成等差数列
'''

a = np.linspace(1,5,40,endpoint = True)
print(a)
'''
logspace 生成等比数列, 注意第一和第二参量代表是10的次幂数,这也是log这个前缀的意义。
'''
aa = np.logspace(0,3,num=10,endpoint = True)
print(aa)

'''
ones 与 zeros 生成器
'''

a = np.ones(5)
print(a)
S = (3,3)
b = np.ones(S,dtype = np.int)
print(b)

x = np.arange(6)
x = x.reshape((2,3))
print(x)

f = np.zeros_like(x)
print(f)

'''
empty 生成器
空实际上是伪随机数
'''

a = np.empty([2,2])
b = np.empty([2,2],dtype = int)

temp = np.array([[1.,2.,3.],[4.,5.,6.]])
c = np.empty_like(temp)
print("a={}\n b={} \n c={}".format(a,b,c))
'''
eye生成器
np.eye(N,M=None,k=0,dtype = float)
'''
a = np.eye(2,dtype = int)
b = np.eye(3,k=1) #  副对角线,正数表示向右上方移动
print("a = {} \n b = {}".format(a,b))

'''
identity 生成器
np.identity(n,dtype = None)
'''

a = np.identity(4,dtype = int)
print('a = \n {}'.format(a))

'''
索引和切片:正整数向前,负数向后
'''

a = np.arange(1,8)
print(a[3])
print(a[-2])

'''
切片
'''

a = np.arange(16) # 创建一个一维数组
a = a.reshape(4,4) # 改变数组形状
print(a)
print(a[1][2])
print(a[1,2])# 结果和上面的一样

print(a[:1]) # 默认输出所有列,前面的:1表示到第一行
print(a[1:]) # 从第2行开始输入到最后
print(a[:,-1]) # 所有行,最后一列的数据
print(a[::2]) # 这表示对所有行间隔按2的整除取

a = np.arange(81)
a = a.reshape(9,9)

print(a[::3]) # 这个例子非常有用

print(a[1:2,2:3]) # 切片得到的还是数组
print(a[1,2]) # 索引得到的是元素

'''
布尔型索引,一般用于解决数据压缩和稀疏矩阵
'''

a = (np.arange(1,17)).reshape(4,4)
x = np.array([0,1,2,1])
print(a)
print(x==1)
print(a[x==1])
print(a[~(x==1)])
print(a[(x==1)|(x==2)])

'''
矩阵的合并和切分
'''

a = np.floor(10*np.random.random((2,2)))
b = np.floor(10*np.random.random((2,2)))
c = np.vstack((a,b)) # 在列上合并
d = np.hstack((a,b)) # 在行上合并

print("a = {}\n b = {} \n c = {} \n d = {}".format(a,b,c,d))

'''
行堆砌和列堆砌
'''

a = np.floor(10*np.random.random((2,2)))
b = np.floor(10*np.random.random((2,2)))

np.column_stack((a,b))

a = np.array([1,2])
b = np.array([3,4])

c = np.column_stack((a,b))

d = np.hstack((a,b))

print("c = {}\n d = {}".format(c,d))

e = np.column_stack((a[:,np.newaxis],b[:,np.newaxis]))

f = np.hstack((a[:,np.newaxis],b[:,np.newaxis]))

print("e = {}\n f = {}".format(e,f))

'''
矩阵计算与线性代数
'''

  1. 范数计算
# np.linalg.norm(x,ord = None,axis = None, keepdims = False)
x = np.array([[1,2,3],[4,5,6]])
print("默认范数:", np.linalg.norm(x))
print("默认范数,且保持数组维数", np.linalg.norm(x,keepdims = True))
print("行向量求范数:", np.linalg.norm(x,axis = 1))
print("列向量求范数:", np.linalg.norm(x,axis = 0))
print("矩阵第一范数:",np.linalg.norm(x,ord = 1,keepdims = True))
print("矩阵无穷范数:",np.linalg.norm(x,ord = np.inf))
print("矩阵每个行向量,求向量的第一范数:",np.linalg.norm(x,ord = 1, axis = 1, keepdims = True))

'''
矩阵的逆
'''

a = np.mat("0 1 2;1 0 3; 4 -3 8") 
# mat方法可以用字符串来构造矩阵,字符串与matlab的矩阵写法一样
print(a)
a_inv = np.linalg.inv(a)
print(a_inv)
print(a_inv*a)

'''
求解线性方程组的解
3x + y - 2z = 1
x + 2y + 3z = 20
5x + 3y - z = 15
'''

a = np.array([[3,1,-2],[1,2,3],[5,3,-1]])
b = np.array([1,20,15])
x = np.linalg.solve(a,b)
print(x)
# 使用dot方法检验结果
print(np.dot(a,x))

'''
计算矩阵行列式
'''

print("矩阵a的行列式是:", np.linalg.det(a))

aaa = np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[2,3],[5,6]]])
print("多维数组aaa的shape是",aaa.shape)
print("多维矩阵aaa的行列式是:",np.linalg.det(aaa))

'''
最小二乘法做线性回归
存在一个三元一次方程 y = a1*x1 + b,通过最小二乘法求解其参数 a1,b
'''

x1 = np.array([0,1,2,3,4,5])
y = np.array([-1,0.2,0.9,2.1,3.3,4.6])
# 扩张 x1 并做转置
A = np.vstack([x1,np.ones(len(x1))]).T
print(A)
m,c = np.linalg.lstsq(A,y)[0]
print(m,c)
#绘图
import matplotlib as mpl
mpl.pyplot.plot(x1,y,'o',label = 'Original data',markersize = 5)
mpl.pyplot.plot(x1,m*x1 + c,'r',label = 'Fitted line')
mpl.pyplot.legend()
mpl.pyplot.show()

'''
实例2
'''

# 数据输入
x = [18,23,25,35,65,54,34,56,72,19,23,42,18,39,37] # 年龄
y = [202,186,187,180,156,167,174,172,153,199,193,174,198,183,178] # 个人最大心率
n = len(x)

B = np.array(y)
A = np.array(([[x[j],1] for j in range(n)]))
a,b = np.linalg.lstsq(A,B)[0]
print("Line is: y = {} * x + {}".format(a,b))
# 绘图
import matplotlib.pyplot as plt
plt.plot(np.array(x),B,'ro',label = 'Original Data', markersize = 5)
plt.plot(np.array(x), a*np.array(x) + b, label = 'Fitted line')
plt.legend()
plt.xlabel(x)
plt.ylabel(y)
plt.show()

'''
求解矩阵的特征向量和特征值
'''

# 创建一个矩阵
C = np.mat("3 -2 ; 1 0")
# 调用eigvals方法求特征值
c0 = np.linalg.eigvals(C)
print("矩阵C的特征值是:",c0)
# 调用eig方法一次求出特征值和特征向量
c1,c2 = np.linalg.eig(C)
print("矩阵的特征值(eig方法):",c1)
print("矩阵的特征向量:",c2)

# 使用dot方法来验证是否正确
for i in range(len(c1)):
    print("LHS is :\n ", np.dot(C,c2[:,i]))
    print("RHS is :\n ", np.dot(c1[i],c2[:,i]))

"""
Numpy 库还有很强大的统计函数,包括amin,amax,nanmax,nanmin, 之类的,也包含均值,方差,极差,中位数等统计函数
除此之外,Numpy库还有排序函数和搜索函数,比如sort 和 argsort, argmax,argmin nanargmax, nanargmin 之类的,
这些函数都很有用,具体需要用到时,可以查相关文档
"""

'''
Numpy的数据保存
'''

A = np.arange(15).reshape(3,5)
print("A = ",A)
# 存在当前目录下
np.save('A.npy',A)
B = np.load('A.npy')
print("B = " , B)

Pandas 入门

# -*- coding: utf-8 -*-

'''
pandas 入门
'''
import pandas as pd
import numpy as np
print(pd.__version__)

# 创建一个pandas数据框
dates = pd.date_range("20130101", periods = 10)
df = pd.DataFrame(np.random.rand(10 , 4), index=dates, columns=list("ABCD"))
# 获取数据
print("获取df的数据:\n {}".format(df))
# 观察数据,一般pandas的数据是非常大的,所以为了查看数据,可以只取前几行或者后几行来看
print("获取前两行的数据:\n {}".format(df.head(2)))
print("获取后两行的数据:\n {}".format(df.tail(2)))
# 查看属性和原始的ndarray
print("获取数据的索引:\n {}".format(df.index))
print("获取维度基本属性:\n {}".format(df.shape))
print('获取数据框中的原始数据:\n {}'.format(df.values))
print('获取数据框中的A列的实际数据:\n {}'.format(df[["A"]].values))
# 数据框的描述性统计
print("数据的描述性统计:\n {}".format(df.describe()))

'''
pandas的两大数据格式:series 和 dataframe,其实还有panel数据格式,但一般用不到
'''
# series
data = np.arange(3)
index = ['a','b','c']
s = pd.Series(data=data, index=index)
print("s = \n {}".format(s))
print("s.index = \n {}".format(s.index))
print("s.value = \n {}".format(s.values))
print("s.dtype = \n {} ".format(s.dtype))

# 也可以不指定index, 这时自动用0123456做indices
s1 = pd.Series(data=data)
print("s1={}".format(s1))

# 也可以用字典直接转换成Series
data1 = {'a': 0, 'b': 1, 'c': 2}
s2 = pd.Series(data1)
print(s2)

# DataFrame
data = (np.arange(6)).reshape(2, 3)
index = ("first", 'second')
columns = ['col1', 'col2', 'col3']
df1 = pd.DataFrame(data=data, index=index, columns=columns)
print('df1 = {}'.format(df1))

# 在不指定索引的时候,数据框用 0 1, 2,3,4...来做indices
# 字典可以很方便的转换成数据框
data1 = {'Bob': ['M', 51, 'worker', 7000], 'Jack': ['M', 28, 'doctor', 12000], 'Alice': ['F', 21, 'student', 0.0]}
index = ['gender', 'age', 'profession', 'income']
df2 = pd.DataFrame(data=data1, index=index)
print('df2 = {}'.format(df2))

# 如果使用双层嵌套字典,则最外层的键被转换成列名,而内层的键则被转换成行名
dict = {'col1': {'row1': 'a', 'row2': np.nan}, 'col2': {'row1': 4, 'row2': 'alan'}}
df3 = pd.DataFrame(data=dict)
print('df3 = {}'.format(df3))

# pandas的文件数据读取
'''
read_csv() # 从csv文件读取数据
read_excel() # 从excel文件读取数据
read_sql() # 从sql数据库的查询结果载入数据
read_pickle() # 读取pickle后的二进制文件中的数据
'''

# pandas中数据的选取和清洗
'''
假如行指标是 a b c d e f g
尝试:df.ix['a':'d',1]
一般情形下,不要使用混合指标,
应该使用df.loc 即索引指标, 和df.iloc 即绝对数字指标 
'''
data = (np.arange(100)).reshape(10,10)
index = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
columns = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X']
df = pd.DataFrame(data=data, index=index, columns=columns)

print(df.ix['a':'d', 1: 5])
print(df.iloc[0:3,1:5])
print(df.loc['a':'d','I':'IV'])

# 选取单元格
print(df.at['a','V'])
print(df.iat[0,4])

'''
数据清洗: 在日常处理的情形下,很多时候数据是不干净的,
有时候是乱码,有时候是缺失值,那么怎么清洗数据呢?
'''
# 构建数据框
df = pd.DataFrame(np.random.randint(1,10,[5,3]),index = ('a','c','e','f','h'),\
                  columns = ['one','two','three'])
df.loc['a','one'] = np.nan
df.loc['c','two'] = -99
df.loc['c','three'] = -99
df.loc['a','two'] = -99
df['four'] = 'bar'
df['five'] = df['one']>0
df2 = df.reindex(['a','b','c','d','e','f','g','h'])
print(df2)

# 丢弃缺失值
df3 = df2.dropna(axis = 0)
print(df3)

# 丢弃全为NaN的行

df3 = df2.dropna(how = 'all')
print(df3)

# 行中有效值(非NaN)个数大于等于4的
df3 = df2.dropna(thresh = 4)
print(df3)

# 特定列中有NaN 的则去除
df3 = df2.dropna(subset = ['one','five'])
print(df3)

# 缺失值填空
df4 = df2.fillna(0)
print(df4)

# 指定填空
df4 = df2.fillna({'one':0,'two':1,'three':0,'five':False})
print(df4)

# 用前值填空,这通常用在时间序列上
df4 = df2.fillna(method = 'ffill')
print(df4)

# 用后值填空
df4 = df2.fillna(method = 'bfill')
print(df4)

# 所有相同值替换
df4 = df2.replace(-99,99)
print(df4)

# 指定列替换
df4 = df2
df4[['two']] = df2[['two']].replace(-99,99)
print(df4)

# 查重和去重
print(df2.duplicated())
# 删除第一次
print(df2.drop_duplicates('one',keep = 'first'))
print(df2.drop_duplicates('one',keep = False))

相关文章

网友评论

      本文标题:Numpy和Pandas基本操作速查

      本文链接:https://www.haomeiwen.com/subject/qwjpfltx.html